因此,我面临方法tableView.reloadData()
被触发太多次的问题,tableView显示重复数据。当我尝试从Firebase数据库获取数据时,会出现此问题。
这是我正在使用的代码:
// This method gets userId of all users that communicated with the current user.
func observeMessageIds(){
let nodeRef = Database.database().reference().child("message-Ids").child(CurrentUser.uid)
nodeRef.observe(.childAdded) { (snap) in
if !self.friendsList.contains(snap.key) { return }
let userMRef = Database.database().reference().child("message-Ids").child(CurrentUser.uid).child(snap.key)
userMRef.observe(.childAdded) { (userSnap) in
self.messagesReference(userSnap.key)
}
}
}
// This method filters each user with their own messages.
func messagesReference(_ key: String){
Database.database().reference().child("messages").child(key).observe(.value) { (snapshot) in
guard let values = snapshot.value as? [String: Any] else { return }
self.loadMessagesHandler(values)
}
}
// This method populates the messages array which populates the tableView.
func loadMessagesHandler(_ values: [String: Any]) {
let message = Messages()
message.sender = values["sender"] as? String
message.recipient = values["recipient"] as? String
message.message = values["message"] as? String
message.time = values["time"] as? NSNumber
message.mediaUrl = values["mediaUrl"] as? String
let user = message.determineUser()
// recentMessages dict populates the message array only with recent messages.
recentMessages[user] = message
messages = Array(recentMessages.values)
messages.sort { (message1, message2) -> Bool in
return message1.time.intValue > message2.time.intValue
}
tableView.reloadData()
}
我尝试使用计时器重新加载数据,但不幸的是,仅当您具有良好的Internet连接时,它才有效。
self.timer.invalidate()
self.timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.handleReload), userInfo: nil, repeats: false)
我尝试在数据库参考上使用queryLimit(toLast: 1)
仅获取最新消息,但是这在我的ChatVC中创建了更多错误。
Github仓库:https://github.com/realpaliy/mChat/blob/master/mChat/Controllers/Chats/ConversationsVC.swift