繁体   English   中英

Swift Firebase-使用Fan Out时如何生成不同的.childByAutoId密钥

[英]Swift Firebase -How to generate different .childByAutoId keys when using Fan Out

我的应用程序中有一个聊天系统。 当用户按下send将消息数据发送到数据库内的其他节点时,它可以正常工作。 我遇到的问题是由于使用扇出时,我在发送数据之前生成了.childByAutoId密钥。 用户按下发送按钮开始该过程,但是它始终是完全相同的.childByAutoId键,因此我只覆盖了先前的消息数据。 如果用户弹出vc并返回到它,那么会创建一个新密钥,但是对于消息传递系统来说,这显然很糟糕吗?

每当用户按下发送扇出时,如何生成不同的.childByAutoId键?

@obj func sendMessageButtonPressed() {

    // ***here's the problem, every time they press send, it's the same exact childByAutoId().key so I'm just overwriting the previous data at the messages/messageId path
    guard let messageId = FirebaseManager.Database.database().reference().child("messages")?.childByAutoId().key else { return }

    var messageIdDict: [String: Any] = [messageId: "1"]

    var messageDict = [String: Any]() // has the fromId, toId, message, and timeStamp on it

    let messageIdPath = "messages/\(messageId)"
    let fromIdPath = "user-messages/\(currentUserId)"
    let toIdPath = "user-messages/\(toId)"

    var fanOutDict = [String: Any]()
    fanOutDict.updateValue(messageDict, forKey: messageIdPath)
    fanOutDict.updateValue(messageIdDict, forKey: fromIdPath)
    fanOutDict.updateValue(messageIdDict, forKey: toIdPath) 

    let rootRef = Database.database().reference()
    rootRef?.updateChildValues(fanOutDict)
}

问题不在于没有生成新密钥。 @FrankvanPuffelen在评论中指出,每次发生时都应该生成一个新密钥。

问题在于,扇出将覆盖最初在以下两个路径中编写的内容:

let fromIdPath = "user-messages/\(currentUserId)"
let toIdPath = "user-messages/\(toId)"

似乎关键是相同的,因为数据不断被覆盖。

我生成密钥的方式很好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM