Firebase Firestore проблема дублирования данных слушателя снимка - PullRequest
0 голосов
/ 10 марта 2019

Я использую Firestore вместе с iglistkit для отображения данных в представлении коллекции. Я пытаюсь понять, почему мой слушатель снимка вызывается дважды с одним и тем же объектом.

Краткое описание вопроса: В Viewdidload я вызываю метод fetchUserFriends() и получаю документы, которые ожидаю от querySnapshot, но по неизвестной причине тело метода вызывается дважды, без каких-либо изменений в данных.

Проблемный код приведен ниже:

 func fetchUserFriends() {
        guard let currentUserId = currentUser?.uid else { return }
        db.collection("friends").whereField(FriendState.isRelationshipActive, isEqualTo: true).whereField("members", arrayContains: currentUserId).order(by: "createdAt", descending: true).addSnapshotListener { [weak self] (querySnapshot, error) in

            if(error != nil) {
                print("error \(String(describing: error?.localizedDescription))")
            }

            guard let querySnapshot =  querySnapshot else { return }

            for document in querySnapshot.documents {
                let friendRelation = UserRelation.init(document: document)
                if(self?.friendsRelations != nil) {
                    self?.friendsRelations?.append(friendRelation)
                } else {
                    self?.friendsRelations = [friendRelation]
                }
            }
            self?.adapter.reloadData(completion: nil)
        }
    }

На основании моей отладки происходит следующее:

  1. fetchUserFriends () вызывается
  2. проходит через охрану let querySnapshot = querySnapshot else {return} и добавляет данные в friendRelations массив
  3. self?.adapter.reloadData(completion: nil)
  4. тогда строка ниже работает Then this code runs

  5. и снова возвращается ко 2-му шагу с тем же объектом, который в этом случае завершается ошибкой из-за дублирующего идентификатора iglistkit.

Спасибо за помощь.

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