addSnapshotListener для получения только изменений в коллекции Firebase - PullRequest
0 голосов
/ 14 октября 2019

Я добавил addSnapshotListener, например:

            doc?.reference.collection("thread")
                .order(by: "created", descending: true)
                .addSnapshotListener(includeMetadataChanges: true, listener: { (threadQuery, error) in

            if let error = error {
                print("Error: \(error)")
                return
            } else {
                //print(threadQuery?.documents.count)
                    for message in threadQuery!.documents {
                        self.removeAllOverlays()
                        print("Data: \(message.data())")
                    }
            }
            })

Каждый раз, когда новый документ добавляется в thread, он загружает полную нить. Как я могу получить только новый документ, добавленный в коллекцию thread?

1 Ответ

0 голосов
/ 14 октября 2019

Для простоты предположим, что есть такая коллекция пользователей, как эта

users
   doc_0
      name: "Pete"
   doc_1
      name: "Lewis"
   doc_2
      name: "Clark"

, следующий код присоединит наблюдателя к узлу пользователей и уведомит нас, когда пользователь будет добавлен, изменен или удален. Отмечая, что при первом запуске он будет перебирать каждого пользователя по одному и запускать .added, что позволит вам, например, первоначально заполнить массив.

func observeUserChanges() {
    let usersCollectionRef = self.db.collection("users")
    usersCollectionRef.addSnapshotListener { querySnapshot, error in
        guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
        }

        snapshot.documentChanges.forEach { diff in
            let userName = diff.document.get("name") as? String ?? "No Name"
            if (diff.type == .added) {
                print("Added user: \(userName)")
            }
            if (diff.type == .modified) {
                print("Modified user: \(userName)")
            }
            if (diff.type == .removed) {
                print("Removed user: \(userName)")
            }
        }
    }
}

При первом запуске выведите это

Added user: Pete
Added user: Lewis
Added user: Clark

затем, когда добавляется новый пользователь, мы видим это

Added user: Ted

при удалении Теда

Removed user: Ted
...