AddSnapShotListener повторяет чтение документа в одном экземпляре - PullRequest
0 голосов
/ 21 ноября 2019

Когда я использую addSnapshotListener для обновлений в реальном времени, документы повторяются, что не должно иметь место, но при использовании getDocuments() документы повторяются только один раз, мне нужно использовать addSnaphotListener, но не хочу дублировать документЧитайте, пожалуйста, помогите, где я ошибаюсь при использовании слушателя снимка.

Я использую базу данных Firestore в Swift iOS. Ниже приведен код, который я использую

Код с addSnapShotListener():

func getComments() {

      //print(postId + "received")
        let commentsRef = Firestore.firestore().collection("posts").document(postId).collection("comments")

        commentsRef.addSnapshotListener { (snapshot, error) in

            if let error = error {

                print(error.localizedDescription)

            } else {

                if let snapshot = snapshot {

                    for document in snapshot.documents {

                      // self.length = snapshot.count


                        let data = document.data()
                        let username = data["comment_author_username"] as? String ?? ""
                        let comment = data["comment_author_comment"] as? String ?? ""
                        let spinnerC = data["comment_author_spinnerC"] as? String ?? ""
                        let fullname = data["comment_author_fullname"] as? String ?? ""
                        let email = data["comment_author_email"] as? String ?? ""
                        let commentUserImageUrl = data["comment_user_image"] as? String ?? ""
                        let commentuser_id = data["comment_author_id"] as? String ??  ""
                        self.checkl1value = data["l1"] as? Bool


                        let newComment = Comment(_documentId: document.documentID, _commentAuthorUsername: username, _commentAuthorFullName: fullname, _commentAuthorComment: comment, _commentUserImage: commentUserImageUrl, _commentAuthorSpinnerC: spinnerC, _commentAuthorId:commentuser_id, _checkl1value: self.checkl1value)

                        self.comments.append(newComment)
                    //   print(self.length!)

                    }
                   self.tableView.reloadData()
                }
            }
        }
    }

Код с getDocuments():

func getComments() {

      //print(postId + "received")
        let commentsRef = Firestore.firestore().collection("posts").document(postId).collection("comments")

        commentsRef.getDocuments { (snapshot, error) in

            if let error = error {

                print(error.localizedDescription)

            } else {

                if let snapshot = snapshot {

                    for document in snapshot.documents {

                      // self.length = snapshot.count


                        let data = document.data()
                        let username = data["comment_author_username"] as? String ?? ""
                        let comment = data["comment_author_comment"] as? String ?? ""
                        let spinnerC = data["comment_author_spinnerC"] as? String ?? ""
                        let fullname = data["comment_author_fullname"] as? String ?? ""
                        let email = data["comment_author_email"] as? String ?? ""
                        let commentUserImageUrl = data["comment_user_image"] as? String ?? ""
                        let commentuser_id = data["comment_author_id"] as? String ??  ""
                        self.checkl1value = data["l1"] as? Bool


                        let newComment = Comment(_documentId: document.documentID, _commentAuthorUsername: username, _commentAuthorFullName: fullname, _commentAuthorComment: comment, _commentUserImage: commentUserImageUrl, _commentAuthorSpinnerC: spinnerC, _commentAuthorId:commentuser_id, _checkl1value: self.checkl1value)

                        self.comments.append(newComment)
                    //   print(self.length!)

                    }
                   self.tableView.reloadData()
                }
            }
        }
    }

1 Ответ

1 голос
/ 21 ноября 2019

Вы, вероятно, хотите обрабатывать только изменения между снимками. Чтобы сделать это, вы захотите зациклить instead of, как показано в документации по просмотру изменений между снимками :

db.collection("cities").whereField("state", isEqualTo: "CA")
    .addSnapshotListener { querySnapshot, error in
        guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
        }
        snapshot.documentChanges.forEach { diff in
            if (diff.type == .added) {
                print("New city: \(diff.document.data())")
            }
            if (diff.type == .modified) {
                print("Modified city: \(diff.document.data())")
            }
            if (diff.type == .removed) {
                print("Removed city: \(diff.document.data())")
            }
        }
    }

Изначально ваш слушатель будетвызывается с diff.type == .added для каждого существующего документа, а затем, когда есть изменения, он вызывается с правильным сочетанием type s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...