使用Firebase查询在reloadData之后复制collectionView单元格 [英] Duplicate collectionView cells after reloadData with Firebase query

查看:37
本文介绍了使用Firebase查询在reloadData之后复制collectionView单元格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Firebase快照侦听器,用于检查新文档,将它们添加到数组(collectionView数据源)中,然后重新加载collectionView.但是,我在collectionView中得到了重复的单元格.我目前在Firebase Firestore集合中有3个对象,但它们被复制了总共9个单元.

I have a Firebase snapshot listener that checks for new documents, adds them to an array (the collectionView datasource) and then reloads the collectionView. However, I'm getting duplicate cells in the collectionView. I currently have 3 objects in my Firebase Firestore collection but they get duplicated for a total of 9 cells.

我什至添加了对索引的检查,因此reloadData仅在到达数组末尾之后才发生.这是相关的代码:

I even added a check for the index so reloadData only happens after it reaches the end of the array. Here's the relevant code:

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()
                }
            }
        }
    }
}

它正确地对索引进行递减计数,因此最终reloadData达到2 == 2.但是,然后又重新启动了此过程,总共进行了两次(共三个)(3个对象加载了三次,共9个单元).知道如何改善这种逻辑流程以阻止重复吗?

It correctly counts down the index so it eventually reaches 2 == 2 to reloadData. However, it then starts the process over again two other times for a total of three (3 objects loaded three times for a total of 9 cells). Any idea how I can improve this logic flow to stop the duplicates?

谢谢!

编辑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)])
        }
    }
}

在重新填充快照文档之前,必须重置

推荐答案

消息数组.您可以在snapshot.documents

messages array must be reset before repopulate snapshot document. You can add self.messages.removeAll() before the line for document in snapshot.documents

这篇关于使用Firebase查询在reloadData之后复制collectionView单元格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆