聊天 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
}

你得到了新聊天项目的无限循环,因为你在观察者中添加新的聊天项目以添加新的聊天项目。当观察者收到新的聊天项添加通知时,您正在添加一个新的聊天项,这又会触发另一个通知,然后循环。您需要在观察者外部添加一个新的聊天项,以便在添加新的聊天项时触发。