我正在尝试创建一个可以工作的聊天应用程序,但我遇到了一个问题。我的数据库结构是这样的:

现在,当我实际调用一个方法来添加新消息时,问题就出现了。显然,有时它没有添加任何东西,有时它正确地添加了一条消息,而在另一些时候,它只是进入了添加最后一条消息的无限循环中。我不知道哪里出了问题,我别无选择。每一次的帮助都会让人感激不尽。
当我按下‘发送’按钮时:
@objc func handleSendTapped() {
guard let userID = user?.uid else { return }
let messageID = UUID().uuidString
let members = [currentUserUID, userID]
let ref = Database.database().reference()
let message = Message(
to: userID,
from: currentUserUID,
content: messageTextField.text,
timeStamp: Date().timeIntervalSince1970 as NSNumber)
// Upload to Chats
let chatsRef = ref.child("chats")
chatsRef.observe(.value) { (snapshot) in
var didAddChat = false
for child in snapshot.children {
if let dataSnapshot = child as? DataSnapshot {
if let chatsDict = dataSnapshot.value as? [String : Any] {
if let chatMembers = chatsDict["members"] as? [String] {
if chatMembers[0] == self.currentUserUID && chatMembers[1] == userID {
// add to existing chat
let chatID = dataSnapshot.key
didAddChat = self.addChat(to: chatID, with: messageID, and: members)
self.addChatToUserChats(withChatID: chatID)
self.addChatMessage(withMessage: message, andMessageID: messageID)
}
// New chat
if !didAddChat {
guard let chatID = chatsRef.childByAutoId().key else { return }
didAddChat = self.addChat(to: chatID, with: messageID, and: members)
self.addChatToUserChats(withChatID: chatID)
self.addChatMessage(withMessage: message, andMessageID: messageID)
}
}
} else {
// New chat when there's no chats at all
guard let chatID = chatsRef.childByAutoId().key else { return }
didAddChat = self.addChat(to: chatID, with: messageID, and: members)
self.addChatToUserChats(withChatID: chatID)
self.addChatMessage(withMessage: message, andMessageID: messageID)
}
}
}
}
}下面是我在handleSendTapped中调用的方法:
func addChat(to chatID: String, with messageID: String, and members: [String]) -> Bool {
let ref = Database.database().reference()
let chatsRef = ref.child("chats")
let values: [String : Any] = [
"lastMessageID" : messageID,
"members" : members
]
chatsRef.child(chatID).updateChildValues(values)
print("added message to: \(chatsRef.child(chatID).description())")
return true
}
func addChatToUserChats(withChatID chatID: String) {
let ref = Database.database().reference()
let userChatsRef = ref.child("userChats")
userChatsRef.child(currentUserUID).child("\(chatID)").setValue("")
}
func addChatMessage(withMessage message: Message, andMessageID messageID: String) {
let ref = Database.database().reference()
let chatMessages = ref.child("chatMessages")
let chatMessageRef = chatMessages.child(messageID)
let values: [String : Any] = [
"contents" : message.content!,
"timeStamp": message.timeStamp!,
"from" : message.from!
]
chatMessageRef.updateChildValues(values) // set
}发布于 2020-06-05 19:01:25
您将获得新聊天项的无限循环,因为您将在观察者中添加新的聊天项以添加新的聊天项。当观察者收到新的聊天项添加通知时,您正在添加一个新的聊天项,这反过来会触发另一个通知,并循环执行。当添加新聊天项目时,您需要在该触发器的观察者之外添加一个新聊天项目。
https://stackoverflow.com/questions/62213610
复制相似问题