【问题标题】:Get specific .childrenCount from Firebase从 Firebase 获取特定的 .childrenCount
【发布时间】:2019-10-21 20:37:08
【问题描述】:

在我的新应用程序(项目控制、iOS App Store ;))中,我希望用户参与开发决策。为此,我在 Firebase 数据库中添加了一个名为“claps”的路径。我想在我的 TableView 中为不同的概念输入以下数字。我已经尝试了以下

self.posts.append(Post(title: post_title, des: post_description, info: "\(post_date) - \(post_user) - \(post_claps) ????", claps: Int(post_claps)))

for var item in self.posts {

    g.ref.child("concepts").child(item.title).queryOrdered(byChild: "claps").observe(.childAdded) { (snapshotClaps: DataSnapshot!) in

        item.claps = Int(snapshotClaps.childrenCount)

    }

}

DispatchQueue.main.async() {

    self.tableView.reloadData()

}

然而,它还不代表正确的那一位,而是它之前的一位。我不知道如何使参考更具体,以真正得到鼓掌下的内容。

这是我的数据库:

目前我的输出是 5,但它应该是 4。你看到它很早就观察到了一个“层”。帮助将不胜感激。也有改进:)

更新:

通过测试,我可以发现问题出在参考文献中。 Int 5 来​​自“顶层”“Journal”的 5 Childs。我的问题是我无法深入了解结构,因为我没有 .child() 的特定字符串

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    由于您正在观察 .childAdded 事件,因此每个匹配的子节点都会调用您的闭包。如果你想计算匹配的子节点的数量,你需要观察.value 事件,它可以确保你的闭包同时被所有匹配的节点调用。

    类似:

    g.ref.child("concepts").child(item.title).observe(.value) { (snapshotClaps: DataSnapshot!) in
        item.claps = Int(snapshotClaps.childrenCount)
    }
    

    请注意,我还删除了 orderBy 子句,因为如果您只使用计数,则它没有任何用处。

    【讨论】:

      【解决方案2】:

      创建一个数组并允许 firebase 填充它。或做类似的事情

      g.ref.child("concepts").child(item.title).observe(.value) { (snapshotClaps: DataSnapshot!) in
          item.claps = Int(snapshotClaps.childrenCount)
      }
      

      观察值确保你的闭包得到它的匹配节点。

      【讨论】:

        【解决方案3】:

        有几个很好的解决方案,但是通过 .value 读取节点的问题是它读取了该节点中的所有内容

        虽然这对于数据量有限的节点来说很好,但当节点包含大量数据时,它会使设备不堪重负。

        所以另一种选择是利用 Firebase 执行所有 .childAdded 事件之前 .value 事件。这样,我们就可以使用 .value 作为所有节点都被读取的触发器。

        这是一个函数,它使用 .childAdded 来迭代和计算 users 节点中的所有用户。此外,还有一个 .value 观察者,它只读取最后一个节点,删除 .childAdded 观察者并通过完成处理程序将计数传递回调用函数。请记住,即使我们同时附加了两个观察者,.childAdded 事件也会在 .value 事件之前触发。

        func countUsers( completion: @escaping(Int) -> Void) {
            var count = 0
        
            let usersRef = self.ref.child("users")
            usersRef.observe(.childAdded, with: { snapshot in
                count+=1
            })
        
            let query = usersRef.queryOrderedByKey().queryLimited(toLast: 1)
            query.observeSingleEvent(of: .value, with: { snapshot in
                usersRef.removeAllObservers()
                completion(count)
            })
        }
        

        调用函数,代码如下

        func getUserCount() {
            self.countUsers(completion: { userCount in
                print("number of users: \(userCount)")
            })
        }
        

        【讨论】:

          猜你喜欢
          • 2019-08-06
          • 1970-01-01
          • 2019-07-03
          • 2019-03-25
          • 2020-11-05
          • 1970-01-01
          • 1970-01-01
          • 2021-06-23
          • 1970-01-01
          相关资源
          最近更新 更多