ios - 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()
再次调用这似乎有效,因为发送消息的用户没有重复的消息。
解决方案
你已经使用了 .value ,而不是你应该使用 childAdded 我认为,那么它只会得到最新添加的孩子而不是以前的孩子。
let userMessageRef = Database.database().reference().child("user-message").child(uid).child(userId).queryLimited(toLast: 10).observe(.childAdded) { (snapshot) in
推荐阅读
- javascript - JavaScript 重定向到基于 URL 的另一个网站
- python - Google Cloud 中的 UMAP 模型加载失败,字节码版本不兼容
- c - 为什么断言不做任何事情?我需要做什么才能让它工作?
- rabbitmq - 响应 RabbitMQ API GET /api/queues 的密钥重复的可能原因
- xml - 肥皂 xml 发送但服务器端差异(“<”,“<”)(“>”,“>”)
- python - 对于这个 sklearn 转换器,我应该遵循正确的列规范吗?
- loops - KDB:使用具有两个变量的递归函数发出问题
- .net - Log4Net:EventLogAppender 创建协议,但不记录
- iis - 网站未加载样式和文件,因为正在加载不同的路径
- google-classroom - 检索到的最大教室 ID 数