我有一个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" : "[email protected]",
"groups" : {
"-KAv867tzVgIghmr15CM" : "true",
"-KAv87nqLEG1Jtc04Ebn" : "true",
"-KAv88yZe8KTfkjAE7In" : "true"
}
}
}
}
每个用户都有元素“群”与childByAutoId()键。然后我有应用程序中存在的所有组的列表。
每次运行应用程序时,我都会得到当前用户登录的URL引用,并获取该用户的组列表(在这种情况下,登录用户是具有3个组的“rsenov”) 。 对于这个用户所属的每个组,我遍历组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”值,所以它不起作用。
在这种情况下,哪种方法可以做出好的查询?
对不起,我已经做到了。不知道这个选项是否可用 – Ruben
你是对的,组和用户是两个顶级节点 – Ruben
澄清;当用户登录时,你想从他们所属的每个组中获取数据(group_id,author和name)? – Jay