Swift 4 и сообщение Firebase дублируются при получении - PullRequest
0 голосов
/ 18 февраля 2019

По какой-то причине, когда пользователь получает сообщение, предыдущие сообщения дублируются.Это странно, потому что пользователь, отправляющий сообщения, не дублирует свои сообщения при отправке сообщения.Любая помощь с моим кодом будет принята с благодарностью.

var messages =  [Message]()
fileprivate func observeMessages() {

    guard let uid = Auth.auth().currentUser?.uid else { return }
    guard let userId = user?.uid else { return }

    if currentKey == nil {

        let userMessageRef = Database.database().reference().child("user-message").child(uid).child(userId).queryLimited(toLast: 10).observe(.value) { (snapshot) in

            guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
            guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

            allObjects.forEach({ (snapshot) in

                let messageId = snapshot.key

                let ref = Database.database().reference().child("messages").child(messageId)
                ref.observeSingleEvent(of: .value, with: { (snapshot) in

                    guard let dict = snapshot.value as? [String: Any] else { return }

                    let message = Message(dictionary: dict)

                    self.messages.append(message)
                    self.messages.sort(by: { (message1, message2) -> Bool in
                        return message1.timeStamp.compare(message2.timeStamp) == .orderedDescending
                    })
                    self.collectionView?.reloadData()
                })
            })
            self.currentKey = first.key

        }

    } else {

        let userMessageRef = Database.database().reference().child("user-message").child(uid).child(userId).queryOrderedByKey().queryEnding(atValue: self.currentKey).queryLimited(toLast: 10).observe(.value) { (snapshot) in

            guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
            guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

            allObjects.forEach({ (snapshot) in

                if snapshot.key != self.currentKey {

                    let messageId = snapshot.key

                    let ref = Database.database().reference().child("messages").child(messageId)
                    ref.observeSingleEvent(of: .value, with: { (snapshot) in

                        guard let dict = snapshot.value as? [String: Any] else { return }

                        let message = Message(dictionary: dict)

                        self.messages.append(message)
                        self.messages.sort(by: { (message1, message2) -> Bool in
                            return message1.timeStamp.compare(message2.timeStamp) == .orderedDescending
                        })
                        self.collectionView?.reloadData()
                    })
                }
            })
            self.currentKey = first.key
        }
    }
}

Единственные места, где вызывается observeMessages(), это willDisplay, как показано ниже, и viewDidLoad

override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

    if messages.count > 2 {
        if indexPath.item == messages.count - 1 {
            observeMessages()
        }
    }
}

Единственная разница между отправляющим и получающим сообщение пользователем заключается в том, что когда пользователь отправляет сообщение и нажимает кнопку отправки сообщения, я набираю self.messages.removeAll(), а затем снова вызываю self.observeMessages(), что, похоже, работает, поскольку пользователь, отправляющий сообщение, неповторяющихся сообщений.

1 Ответ

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

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

 let userMessageRef = Database.database().reference().child("user-message").child(uid).child(userId).queryLimited(toLast: 10).observe(.childAdded) { (snapshot) in
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...