首页 > 解决方案 > Swift 4 和 Firebase 消息在收到时被复制

问题描述

由于某种原因,当用户接收消息时,过去的消息被复制。这很奇怪,因为发送消息的用户在发送消息时没有重复他们的消息。对我的代码的任何帮助将不胜感激。

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

标签: iosswiftfirebasefirebase-realtime-databaseswift4

解决方案


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

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

推荐阅读