gpt4 book ai didi

ios - Swift 中的 Firebase 嵌套查询无法正常工作

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:49 24 4
gpt4 key购买 nike

我有一个如下所示的 JSON 结构:

{
"groups" : {
"-KAv867tzVgIghmr15CM" : {
"author" : "ruben",
"name" : "Item A"
},
"-KAv87nqLEG1Jtc04Ebn" : {
"author" : "ruben",
"name" : "Item B"
},
"-KAv88yZe8KTfkjAE7In" : {
"author" : "ruben",
"name" : "Item C"
}
},
"users" : {
"rsenov : {
"avatar" : "guest",
"email" : "ruben@ruben.com",
"groups" : {
"-KAv867tzVgIghmr15CM" : "true",
"-KAv87nqLEG1Jtc04Ebn" : "true",
"-KAv88yZe8KTfkjAE7In" : "true"
}
}
}
}

每个用户都有带有 childByAutoId() 键的元素“groups”。然后我有应用程序中存在的所有组的列表。

每次运行该应用程序时,我都会获取当前用户登录的 url 引用,并获取该用户的组列表(在本例中,登录用户是“rsenov”,它有 3 个组)。对于该用户所属的每个组,我遍历组 url 引用,寻找获取这 3 个组的信息。

我是这样做的:

func loadTable() {
self.groups = []
var counter = 0
self.meses = []
var tempItems = [String]()

DataService.dataService.CURRENT_USER_GROUPS_REF.observeEventType(.Value, withBlock: { snapshot in

if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] {
tempItems = []
for snap in snapshots {

DataService.dataService.GROUPS_REF.childByAppendingPath(snap.key).queryOrderedByChild("name").observeEventType(.Value, withBlock: { snapshot in
if let postDictionary = snapshot.value as? Dictionary<String, AnyObject> {
tempItems.append(snapshot.value.objectForKey("name") as! String)
let key = snapshot.key
let group = Group(key: key, dictionary: postDictionary)
self.groups.insert(group, atIndex: 0)

}
counter++
if (counter == snapshots.count) {
self.meses = tempItems
self.miTabla.reloadData()

}
})
}
}
})
}

我认为以这种方式进行迭代并不是一个好主意。例如,如果 GROUPS_REF url 中的某个子项发生更改,则代码仅在该嵌套代码中运行,并且由于它没有从 for 循环中获取的“snap.key”值,因此它不起作用.

在这种情况下,执行良好查询的最佳方法是什么?

最佳答案

哎呀,这花了一些时间来写。主要是因为我不太喜欢 iOS/Swift:

let ref = Firebase(url: "https://stackoverflow.firebaseio.com/35514497")
let CURRENT_USER_GROUPS_REF = ref.childByAppendingPath("users/rsenov/groups")
let GROUPS_REF = ref.childByAppendingPath("groups")

var counter: UInt = 0
var groupNames = [String]()

CURRENT_USER_GROUPS_REF.observeEventType(.Value, withBlock: { groupKeys in
for groupKey in groupKeys.children {
print("Loading group \(groupKey.key)")
GROUPS_REF.childByAppendingPath(groupKey.key).observeSingleEventOfType(.Value, withBlock: { snapshot in
print(snapshot.value)
if (snapshot.childSnapshotForPath("name").exists()) {
groupNames.append(snapshot.value.objectForKey("name") as! String)
}
counter++
if (counter == groupKeys.childrenCount) {
print(groupNames)
}
})
}
})

顺便说一句,这就是您创建 minimal, complete verifiable example 的方式.该代码没有外部依赖项(例如代码中的 GroupDataService),仅包含与答案相关的内容。

重要的部分:

  • 我使用 observeSingleEventOfType 获取每个组,因为我不想在组更改时获得更多回调
  • 我使用 snapshot.childSnapshotForPath("name").exists() 来检查您的组是否有名称。您可能想要确保它们都有名称,或者将它们添加到具有真实应用中其他属性的列表中。

关于ios - Swift 中的 Firebase 嵌套查询无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35514497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com