[英]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.