Swift 4 和 Firebase 如何计算子值

1 firebase swift firebase-realtime-database

我试图通过返回值等于 1 的所有用户来获取每个人的计数。这是正确的做法吗?下面是我用来设置他们是否要去的功能。有人可以帮我返回每个人去的人数吗

func didTapGoing(for cell: HomePostCell) {
    guard let indexPath = collectionView?.indexPath(for: cell) else { return }
    var post = self.posts[indexPath.item]

    guard let postId = post.id else { return }

    guard let uid = FIRAuth.auth()?.currentUser?.uid else { return }

    let values = [uid: post.isGoing == true ? 0 : 1]
    FIRDatabase.database().reference().child("going").child(postId).updateChildValues(values) { (err, _) in

        if let err = err {
            print("Failed to pick going", err)
            return
        }

        post.isGoing = !post.isGoing
        self.posts[indexPath.item] = post
        self.collectionView?.reloadItems(at: [indexPath])
    }
}
Run Code Online (Sandbox Code Playgroud)

数据库

Fra*_*len 6

您共享的代码不会读取任何数据,而只会使用updateChildValues.

要计算子节点的数量,您需要读取这些节点,然后调用DataSnapshot.childrenCount.

FIRDatabase.database().reference().child("going").child(postId).observe(DataEventType.value, with: { (snapshot) in
  print(snapshot.childrenCount)
})
Run Code Online (Sandbox Code Playgroud)

如果您只想计算值为 1 的子节点,您可以这样做:

FIRDatabase.database().reference().child("going").child(postId)
  .queryOrderedByValue().queryEqual(toValue: 1)
  .observe(DataEventType.value, with: { (snapshot) in
    print(snapshot.childrenCount)
  })
Run Code Online (Sandbox Code Playgroud)

有关这方面的更多信息,请阅读有关排序和过滤数据的 Firebase 文档。