【问题标题】:Swift 4 & Firebase message being duplicated when they are receivedSwift 4 和 Firebase 消息在收到时被复制
【发布时间】:2019-07-11 18:04:44
【问题描述】:

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

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() 被调用的唯一地方是willDisplayviewDidLoad

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 我认为,那么它只会得到最新添加的孩子而不是以前的。

标签: ios swift firebase firebase-realtime-database swift4


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2020-01-21
    • 2018-01-03
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多