Ios FirebaseChat Swift4
当我发送消息时,它会多次从Firebase获取数据 我的聊天功能不正常。当我发送新消息并显示在tableview上时,它会多次接收消息 func getChatData(){Ios FirebaseChat Swift4,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,当我发送消息时,它会多次从Firebase获取数据 我的聊天功能不正常。当我发送新消息并显示在tableview上时,它会多次接收消息 func getChatData(){ 根据您从数据库读取数据的方式,快照将在每次调用时包含聊天下的全部数据 有两个选项可防止在UI中显示重复数据: 侦听.child***事件,而不是.value。这样做意味着(假设添加了一条消息)您的.childAdded观察者只会通过新消息的快照调用 或者,每次从数据库获取数据时,只需清空getData。这可能会导致UI更新
根据您从数据库读取数据的方式,
快照
将在每次调用时包含聊天
下的全部数据
有两个选项可防止在UI中显示重复数据:
.child***
事件,而不是.value
。这样做意味着(假设添加了一条消息)您的.childAdded
观察者只会通过新消息的快照调用
getData
。这可能会导致UI更新中出现一些闪烁,但这是对当前代码的最小更改。为此,只需在快照{中的项的之前添加self.getData=[]
//self.getData = []
ref.child("Chats").observe(.value) { (snapshot) in
if let snapshot = snapshot.children.allObjects as? [DataSnapshot]{
for item in snapshot{
if let postData = item.value as? [String: Any]{
let message = postData["message"]as? String
let orderid = postData["orderid"]as? Int
let receiver = postData["receiver"]as? String
let receiverUid = postData["receiverUid"]as? String
let sender = postData["sender"]as? String
let senderUid = postData["senderUid"]as? Int
let timestamp = postData["timestamp"]as? String
if self.orderId == orderid{
//self.getData.removeAll()
self.getData.append(GetChat(message: message ?? "", orderid: orderid ?? 0, receiver: receiver ?? "", receiverUid: receiverUid ?? "", sender: sender ?? "", senderUid: senderUid ?? 0, timestamp: timestamp ?? ""))
}
}
}
self.tableView.reloadData()
//self.tableView.reloadInputViews()
}