Ios FirebaseChat Swift4

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更新

当我发送消息时,它会多次从Firebase获取数据

我的聊天功能不正常。当我发送新消息并显示在tableview上时,它会多次接收消息

func getChatData(){


根据您从数据库读取数据的方式,
快照
将在每次调用时包含
聊天
下的全部数据

有两个选项可防止在UI中显示重复数据:

  • 侦听
    .child***
    事件,而不是
    .value
    。这样做意味着(假设添加了一条消息)您的
    .childAdded
    观察者只会通过新消息的
    快照调用
  • 或者,每次从数据库获取数据时,只需清空
    getData
    。这可能会导致UI更新中出现一些闪烁,但这是对当前代码的最小更改。为此,只需在快照{
    中的项的
    之前添加
    self.getData=[]
  • 很高兴听到@MohammadTalha。
        //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()
            }