聊天 Firebase 结构
Chat firebase structure
我正在尝试创建一个有效的聊天应用程序,但我遇到了问题。我已经像这样构建了我的数据库:
现在,当我实际调用一种方法来添加新消息时,问题就出现了。显然有时它不添加任何东西,有时它正确添加一条消息,而在其他时候它只是进入添加最后一条消息的无限循环。我不知道出了什么问题,我别无选择。我们将不胜感激。
当我按下 'send' 按钮时:
@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
}
你得到了新聊天项目的无限循环,因为你在观察者中添加新的聊天项目以添加新的聊天项目。当观察者收到新的聊天项添加通知时,您正在添加一个新的聊天项,这又会触发另一个通知,然后循环。您需要在观察者外部添加一个新的聊天项,以便在添加新的聊天项时触发。
我正在尝试创建一个有效的聊天应用程序,但我遇到了问题。我已经像这样构建了我的数据库:
现在,当我实际调用一种方法来添加新消息时,问题就出现了。显然有时它不添加任何东西,有时它正确添加一条消息,而在其他时候它只是进入添加最后一条消息的无限循环。我不知道出了什么问题,我别无选择。我们将不胜感激。
当我按下 'send' 按钮时:
@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
}
你得到了新聊天项目的无限循环,因为你在观察者中添加新的聊天项目以添加新的聊天项目。当观察者收到新的聊天项添加通知时,您正在添加一个新的聊天项,这又会触发另一个通知,然后循环。您需要在观察者外部添加一个新的聊天项,以便在添加新的聊天项时触发。