Повторяющиеся ячейки collectionView после reloadData с запросом Firebase - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть прослушиватель моментальных снимков Firebase, который проверяет наличие новых документов, добавляет их в массив (источник данных collectionView) и затем перезагружает collectionView.Тем не менее, я получаю дубликаты ячеек в collectionView.В настоящее время в моей коллекции Firebase Firestore есть 3 объекта, но они дублируются в общей сложности на 9 ячеек.

Я даже добавил проверку индекса, поэтому reloadData происходит только после достижения конца массива.Вот соответствующий код:

messageListener = query.addSnapshotListener { querySnapshot, error in
    guard let snapshot = querySnapshot else {
        print("Error listening for channel updates: \(error?.localizedDescription ?? "No error")")
        return
    }

    snapshot.documentChanges.forEach { change in

        if change.type == .added {
            for document in snapshot.documents{

                 ....

                let newMessage = Message(sender: newSender, messageId: document.documentID, sentDate: date, text: text)

                self.messages.append(newMessage)

                guard let index = snapshot.documents.index(of: document) else {return}

                if index == (snapshot.documents.count - 1) {
                    self.messagesCollectionView.reloadData()
                }
            }
        }
    }
}

Он правильно отсчитывает индекс, поэтому в конечном итоге достигает 2 == 2 для reloadData.Однако затем он запускает процесс снова два раза, в общей сложности три (3 объекта загружаются три раза, всего 9 ячеек).Любая идея, как я могу улучшить этот логический поток, чтобы остановить дубликаты?

Спасибо !!

РЕДАКТИРОВАТЬ 1

extension ChatViewController: MessagesDataSource {

    func currentSender() -> Sender {
        //guard let currentUserID = User.current?.key else {return nil}
        let newSender = Sender(id: (User.current?.key)!, displayName: (User.current?.username)!)
        return newSender
    }

        func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int {
    return 1
}

func numberOfItems(inSection section: Int, in messagesCollectionView: MessagesCollectionView) -> Int {
    return messages.count
}
    func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType {
        return messages[indexPath.section]

        func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {

            return NSAttributedString(string: MessageKitDateFormatter.shared.string(from: message.sentDate), attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 10), NSAttributedString.Key.foregroundColor: UIColor.darkGray])
        }

        func messageTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
            let name = message.sender.displayName
            return NSAttributedString(string: name, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption1)])
        }

        func messageBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {

            let dateString = formatter.string(from: message.sentDate)
            return NSAttributedString(string: dateString, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)])
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Вы должны очистить массив, содержащий ваши объекты после

collectionView?.refreshControl?.beginRefreshing()
self.messages = []

И затем вызвать

self.collectionView?.reloadData()

В противном случае вы получите ошибку «Индекс вне диапазона»

0 голосов
/ 18 февраля 2019

messages массив должен быть сброшен до повторного заполнения снимка документа.Вы можете добавить self.messages.removeAll() перед строкой for document in snapshot.documents

...