swift - 如何将用户添加到 Firebase 编号数组
问题描述
我是 firebase 的新手,并试图在登录时将用户添加到聊天组。我的函数目前通过使用 childbyautoid 将用户附加到“成员”,但这会添加一个 firebase 生成的 ID 密钥和名为 uid 的密钥。
我想要做的是生成序列中的下一个数字作为键,用户 ID 作为值。
我在 Swift 中的功能:
let key = self.databaseRef.child("groups").child("-LEf3_zagKHB6qQEbTL7").child("members").childByAutoId().key
let newuser = ["uid": uid]
let childUpdates = ["/members/\(key)": newuser]
self.databaseRef.child("groups").child("-LEf3_zagKHB6qQEbTL7").updateChildValues(childUpdates)
当我尝试向组中添加第四个成员时,这就是我在 Firebase 中为组“LEf3_zagKHB6qQEbTL7”得到的...
{
"description" : "The Tribe",
"members" : {
"0" : "5pw4MkVxKob8nXiHojTl61tQQ822",
"1" : "FeP6H8H0PyVjMDcqwH3zbY0xAxg2",
"2" : "ZtcfskmMydQmGIarYyKiuO6cKbh1",
"-BdfJitm1T_fu1ssXcUY" : {
"uid" : "dSiUpZfdRpXxE7WQL01T5lOUkfF2"
}
},
"title" : "popupzendo"
}
我期待看到的是这个……
{
"description" : "The Tribe",
"members" : {
"0" : "5pw4MkVxKob8nXiHojTl61tQQ822",
"1" : "FeP6H8H0PyVjMDcqwH3zbY0xAxg2",
"2" : "ZtcfskmMydQmGIarYyKiuO6cKbh1",
"3" : "dSiUpZfdRpXxE7WQL01T5lOUkfF2"
}
},
"title" : "popupzendo"
}
解决方案
如果要顺序增加索引,首先必须读取整个数组,确定下一个索引,将新子索引设置为该索引,然后将其写回。整个事情必须在事务中发生,以消除其他人在同一时间也添加一个孩子并且他们都获得相同索引的机会。这也意味着当用户间歇性地与服务器断开连接时,该操作将不起作用。
如果所有这些听起来都比预期的要棘手,您可能会明白为什么 Firebase 的push()
操作会生成不同类型的密钥。虽然它比顺序索引复杂得多,但它绕过了前面提到的所有问题:它不需要事务,没有冲突的机会,甚至不需要用户连接到服务器。
有关数组索引为何难以与大规模多用户场景结合的更多信息,请阅读经典博客文章最佳实践:Firebase 中的数组。
如果您坚持使用数组索引,我建议您查看这些帖子:
有关在 Swift 中处理 Firebase 列表的更多信息,请参阅:
推荐阅读
- java - 如何将元素从外部 java 库导入 AnyLogic 工作区(调色板)?
- excel - LibreOffice 或 Excel:跨列随机化项目而不重复
- python - 如何在 Django 中使用 pathlib.Path?
- java - 如何使用 classname.java 而不是 App.java 创建 Java 项目
- css - 使用 Bootstrap Modal 4.3 垂直对齐中心
- python - 连接预测值 LSTM Keras
- javascript - ESLint 中的循环问题
- r - 你如何将xml文件转换为R中的数据框
- php - 将 GET 变量转换为 PHP 字符串以用于 SQL 查询
- excel - 将数据从 Excel 粘贴到 Angular Kendo UI 网格时删除空白行