首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Chat firebase结构

Chat firebase结构
EN

Stack Overflow用户
提问于 2020-06-05 18:49:22
回答 1查看 62关注 0票数 0

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

现在,当我实际调用一个方法来添加新消息时,问题就出现了。显然,有时它没有添加任何东西,有时它正确地添加了一条消息,而在另一些时候,它只是进入了添加最后一条消息的无限循环中。我不知道哪里出了问题,我别无选择。每一次的帮助都会让人感激不尽。

当我按下‘发送’按钮时:

代码语言:javascript
复制
@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中调用的方法:

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 19:01:25

您将获得新聊天项的无限循环,因为您将在观察者中添加新的聊天项以添加新的聊天项。当观察者收到新的聊天项添加通知时,您正在添加一个新的聊天项,这反过来会触发另一个通知,并循环执行。当添加新聊天项目时,您需要在该触发器的观察者之外添加一个新聊天项目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62213610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档