聊天视图中的重复消息。如何清除视图?

Posted

技术标签:

【中文标题】聊天视图中的重复消息。如何清除视图?【英文标题】:Repeated messages in chatView. how to clear view? 【发布时间】:2021-10-12 23:39:45 【问题描述】: 我有一个带有 chatRow 视图(消息)列表的 chatView 每个 chatView 都有一个带有 firebase 的快照侦听器,所以如果我向对话中添加新消息,我应该会得到实时更新

我遇到的问题是:当我添加一条新消息时,我的 chatView 会显示我之前添加的所有消息以及新消息,再加上相同的列表......如果我添加另一条消息,那么列表会再次重复

我假设我需要删除/刷新 Foreach 循环中显示的先前视图...如何删除/刷新视图以便接收刷新后的非重复数据?

struct ChatView: View 
    
    @EnvironmentObject var chatModel: ChatsViewModel
    
    let chat: Conversation
    let user = UserService.shared.user
    @State var messagesSnapshot = [Message]()
    
    @State var newMessageInput = ""
    
    var body: some View 
        NavigationView 
            VStack 
                ScrollViewReader  scrollView in
                    ScrollView 
                        
                        ForEach(chat.messages, id: \.id)  message in
                            if user.name == message.createdBy 
                                ChatRow(message: message, isMe: true)
                             else 
                                ChatRow(message: message, isMe: false)
                            
                        
                        .onAppear(perform: scrollView.scrollTo(chat.messages.count-1))
                    
                    
                
                Spacer()
                
                //send a new message
                ZStack 
                    Rectangle()
                        .foregroundColor(.white)
                    
                    RoundedRectangle(cornerRadius: 20)
                        .stroke(Color("LightGrayColor"), lineWidth: 2)
                        .padding()
                    
                    HStack 
                        TextField("New message...", text: $newMessageInput, onCommit: 
                            print("Send Message")
                        )
                        .padding(30)
                        
                        Button(action: 
                            chatModel.sendMessageChat(newMessageInput, in: chat, chatid: chat.id ?? "")
                            print("Send message.")
                        ) 
                            Image(systemName: "paperplane")
                                .imageScale(.large)
                                .padding(30)
                        
                    
                
                .frame(height: 70)
            
            .navigationTitle("Chat")
        
        
    


向对话添加消息的功能

func addMessagesToConv(conversation: Conversation, index: Int) 
        var mensajesTotal = [Message]()
        
        let ref = self.db.collection("conversations").document(conversation.id!).collection("messages")
            .order(by: "date")
            .addSnapshotListener  querySnapshotmsg, error in
            
            if error == nil 
                //loop throug the messages/docs
                for msgDoc in querySnapshotmsg!.documents 
                    var m = Message() //emtpy struc message
                    m.createdBy = msgDoc["created_by"] as? String ?? ""
                    m.date = msgDoc["date"] as? Timestamp ?? Timestamp()
                    m.msg = msgDoc["msg"] as? String ?? ""
                    m.id = msgDoc.documentID //firebase auto id
                    
                    mensajesTotal.append(m) //append this message to the total of messages
                    self.chats[index].messages.removeAll()
                    self.chats[index].messages = mensajesTotal
                
             else 
                print("error: \(error!.localizedDescription)")
            
        
    

【问题讨论】:

您可以尝试将这两行:self.chats[index].messages.removeAll()self.chats[index].messages = mensajesTotal 放在 for msgDoc in querySnapshotmsg!.documents ... 之外 【参考方案1】:

您已在快照侦听器外部定义了mensajesTotal。所以,它每次都会被附加。

要解决此问题,请移动此行:

var mensajesTotal = [Message]()

addSnapshotListener 闭包内。

【讨论】:

哎呀哎呀,我应该看到的,谢谢!【参考方案2】:

你有两个选择:

    每次从数据库中获得更新时清除 mensajesTotal,如 @jnpdx 的 answer 所示。

    querySnapshotmsg.documentChanges 中处理更精细的更新以在您的 UI 中执行增量更新,如detecting changes between snapshots 上的文档中所示。

这些方法在客户端和服务器之间传输的数据没有区别,因此请使用最简单(通常是 #1)或在 UI 上最高效(通常是 #2)的方法。

【讨论】:

谢谢,我会读到选项 2,谢谢!

以上是关于聊天视图中的重复消息。如何清除视图?的主要内容,如果未能解决你的问题,请参考以下文章

订阅 AWS AppSync 中的群组/私人聊天列表

如何清除数据网格视图

如何清除 Quickblox 中的聊天记录?

如何清除视图中的所有数据并重新加载?

调用popToViewController后如何清除视图中的文本框

如何在 recyclerView 中的两个不同项目之间显示不同的项目?