【问题标题】:Firebase Nested Query With Completion完成的 Firebase 嵌套查询
【发布时间】:2017-03-28 01:48:20
【问题描述】:

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

我的 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)
    }
}

我想获得用户,但不知道该怎么做。

【问题讨论】:

  • 能否贴出DataService类的相关代码?
  • 只是 CONTENTLIKE_REF = FIRDatabase.database().reference(withPath: "contentlikes")
  • 您是否在您的应用委托中配置 Firebase?
  • 到底是什么问题?
  • 我无法通过按键获取用户,或者我可以多次获取同一用户 :)

标签: ios swift firebase firebase-realtime-database


【解决方案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)
            }
        }

【讨论】:

  • if(userFetched == snapshot.children.count) 抛出错误!?
  • 在初始化期间将值 userFetched 设置为 1。 var userFetched = 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2017-04-19
相关资源
最近更新 更多