检查是否在特定文档(例如documentChanges)中为Firestore中的集合添加了新字段

时间:2019-12-23 13:58:00

标签: swift google-cloud-firestore

我将此代码用于表格视图中的加载注释:

func observePostComments(postId: String, completion: @escaping (String) -> Void) {
    let db = Firestore.firestore()
    db.collection("post-comments").document(postId).addSnapshotListener { (snapshot, err) in

        if snapshot!.exists {
            for key in (snapshot?.data()!.keys)! {
                completion(key)
        }
        } else {
            return
        }
    }
}

它的工作原理与应该的一样,但是每次用户创建新评论时,都会再次添加所有评论。我知道它对以下集合的工作方式:

querySnapshot?.documentChanges.forEach { diff in
        if (diff.type == .added) { ....

但是我不知道如何在文档/字段级别上实现该功能。如果我想在文档级别执行相同操作,则会收到 “ DocumentSnapshot”类型的值?没有成员'documentChanges'

将新的键值对添加到文档后,如何跟踪特定文档级别的更改?

1 个答案:

答案 0 :(得分:1)

Firestore的更改检测仅适用于完整的文档。如果您需要了解文档内部的更改,则必须在自己的代码中进行检测,例如,将先前的DocumentSnapshot与新的进行比较。

执行此操作的确切方法在某种程度上取决于您存储的数据,但是有两种广泛的方法:

  1. 您需要对每个注释进行独特的处理,并检查UI中是否已存在该注释。例如,这可以是每个评论的ID,但是其他唯一的功能也可以。
  2. 您为每个评论存储一个时间戳,并跟踪已处理的最新时间戳。然后,在更新中,您将跳过所有注释,直到该时间戳记为止。

另一种方法是在向UI添加相同的注释之前清除UI。像这样:

db.collection("post-comments").document(postId).addSnapshotListener { (snapshot, err) in

if snapshot!.exists {
    clearCommentsFromUI() // this is a function you will have to implement
    for key in (snapshot?.data()!.keys)! {
        completion(key)
}