每次我输入 ChatScreen() 消息都会与日志重复
ForEach<Array<Message>, String, MessageView>: the ID //messageID occurs multiple times within the collection, this will give undefined results!
struct ChatScreen: View {
@State private var message = ""
var groupId: String
var userId: String
var userName: String
@ObservedObject private var chatViewModel = ChatViewModel()
init(groupId: String, userId: String, userName: String) {
self.groupId = groupId
self.userId = userId
self.userName = userName
}
var body: some View {
VStack {
ScrollView{
VStack(alignment: .leading, spacing: 10) {
ForEach(chatViewModel.messages, id: \.messageId) { message in
MessageView(message: message)
}
}
.padding()
}
.onAppear {
chatViewModel.observeMessages(groupId: groupId)
}
HStack {
TextField("Type your message here", text: $message)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button("Send") {
chatViewModel.sendMessage(messageText: message, userId: userId, groupId: groupId, userName: userName)
message = ""
}
}
.padding()
}
}
}
这是我的消息观察器函数:
func observeMessages(groupId: String) {
let messagesRef = databaseRef.child("groups/\(groupId)/messages")
messagesRef.observe(.childAdded) { snapshot, error in
let message = Message(snapshot: snapshot)
self.messages.append(message)
}
}
消息仅在设备中重复(不在数据库中),重新启动应用程序后,重复的消息就会消失,但每次我回到组列表屏幕,然后回到聊天屏幕时,消息都会重复
每次收到新一批消息时都需要清除
self.messages
:
所以类似:
func observeMessages(groupId: String) {
let messagesRef = databaseRef.child("groups/\(groupId)/messages")
messagesRef.observe(.childAdded) { snapshot, error in
let message = Message(snapshot: snapshot)
self.messages.append(message)
}
messagesRef.observe(.value) { snapshot, error in
self.messages.clearAll()
}
}