Firebase嵌套查询完成

时间:2017-03-27 16:02:52

标签: ios swift firebase firebase-realtime-database

我正在尝试使用firebase获取嵌套数据。但我的代码有问题。

我的火力基础数据是:

-contentlikes
    -userID: true,
    -userID: true,
    -userID: true
-users
    -userID
        -name: "John"

我的代码是:

override func viewWillAppear(_ animated: Bool) {
    self.displayUserKeys(completionHandler: { (userKeysInside, errorInside) in
        if userKeysInside != nil {
            self.userKeys = userKeysInside!
            print(self.userKeys)
        }
        self.detailUserTableView.rowHeight = UITableViewAutomaticDimension
        self.detailUserTableView.estimatedRowHeight = 64
        self.detailUserTableView.dataSource = self
        self.detailUserTableView.delegate = self
        self.detailUserTableView.reloadData()
    })
}

func displayUserKeys(completionHandler: @escaping ([String]?, Error?) -> ()) {
    self.detailUserHandler = DataService.dataService.CONTENTLIKE_REF.observe(.value, with: { (snapshot) in
        self.userKeys.removeAll()
        var userKeyInside = [String]()
        for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
            let key = child.key
            userKeyInside.append(key)
        }
        completionHandler(userKeyInside, nil)
    }) { (errorInside) in
        completionHandler(nil, errorInside)
    }
}

我想吸引用户,但无法弄清楚我该怎么做。

1 个答案:

答案 0 :(得分:1)

您需要根据从第一个查询获得的密钥从其他用户节点获取用户详细信息。 Firebase不提供连接查询,因此我们必须再次查询ObserveSingleEvent类型的用户详细信息。

这是一个示例代码。我没有使用xcode编辑器编写它,所以请原谅任何愚蠢的错误。

        func displayUserKeys(completionHandler: @escaping ([String]?, Error?) -> ()) {
            self.detailUserHandler = DataService.dataService.CONTENTLIKE_REF.observe(.value, with: { (snapshot) in
                self.userKeys.removeAll()
                var userKeyInside = [String]()
                var userFetched = 0

                for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
                    let key = child.key

                    //Query again to fetch user details.   
                    DataService.dataService.USER_REF.path(key).observeSingleEvent(.value, with: { (snapshot) in
                                userFetched = userFetched + 1
                                let user = snapshot.value  
                               //Append user to the array
                               userInside.append(user)
                      //Return back the array when all the user details as fetched.
                      if(userFetched == snapshot.children.count){
                          completionHandler(userInside, nil)
                       }
                    })
                }



            }) { (errorInside) in
                completionHandler(nil, errorInside)
            }
        }