从Firebase检索数据后操作数据

时间:2017-10-17 11:46:38

标签: ios swift firebase firebase-realtime-database

这是我的代码:

//从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”

1 个答案:

答案 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)")
    })

使用此代码,您只会看到一个日志记录输出,其中包含所有匹配的爱好名称。