这是我的代码:
//从Firebase获取数据
func getData(withBlock completion:@escaping() ->Void){
let ref = Database.database().reference().child("hobbies")
let query = ref.queryOrdered(byChild: "cost").queryEqual(toValue: "low")
query.observe(.childAdded, with: {(snapshot) in
self.user_choice_Cost.append((snapshot.childSnapshot(forPath: "hobbyName").value as? String)!)
completion()
//print(self.user_choice_Cost)
})
{ (error) in
print(error)
}
//操纵数据
getData{
let set2:Set<String> = ["a"]
let set1:Set<String> = Set(self.user_choice_Cost)
print(set1.union(set2))}
这可以正常工作!但有什么办法可以让user_choice_Cost获得所有值([“a”,“b”])而不是逐个([“a”],[“a”,“b”)]并操纵user_choice_Cost数组没有把它放在getData {}里面。因为如果我把它放在外面它将只返回“a”
答案 0 :(得分:0)
当您观察.childAdded
时,将为与您的查询匹配的每个子项调用您的完成处理程序。如果您只想为所有匹配的孩子调用一次,您应该观察.value
:
query.observe(.value, with: {(snapshot) in
由于您的完成处理程序仅被调用一次,因此本例中的快照包含所有匹配的节点。所以你需要循环snapshot.children
:
query.observe(.value, with: {(snapshot) in
for child in snapshot.children.allObjects as! [DataSnapshot] {
let value: String = (child.childSnapshot(forPath: "hobbyName").value as? String)!;
user_choice_Cost.append(value)
}
print("value \(user_choice_Cost)")
})
使用此代码,您只会看到一个日志记录输出,其中包含所有匹配的爱好名称。