Swift 4 & Firebase 消息在收到时被复制

Swift 4 & Firebase message being duplicated when they are received

由于某种原因,当用户收到一条消息时,过去的消息被复制了。这很奇怪,因为发送消息的用户在发送消息时没有复制他们的消息。非常感谢对我的代码的任何帮助。

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() 这似乎有效,因为发送消息的用户没有重复的消息。

你已经使用了 .value ,而不是你应该使用 childAdded 我认为,那么它只会得到最新添加的 child 而不是以前的。

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