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