【发布时间】:2017-06-04 17:42:45
【问题描述】:
我最近被告知要以不同的方式构建 Firebase。在我将与特定用户相关的所有内容放在他或她的树下之前。但是有人告诉我将其展平并分别创建他或她的节点,然后在需要时将该节点链接到该用户树。
所以我的树看起来像这样
root
card
*card autoID*
nickname: "foo"
type: "bar"
user
*user uid*
card
*card autoID*: true
随着用户在应用程序中的进展,我将向卡片添加更多内容,如果我了解我应该如何构造数据,我会将其添加到卡片节点,因为该卡片已链接到用户.
我的问题是如何从 Firebase 中提取数据然后放入数组或字典中?如果它都在一棵树上,我会做这样的事情
let ref = FIRDatabase.database().reference()
let user = FIRAuth.auth()?.currentUser
let userCard = ref.child((user?.uid)!).child("card")
但既然用户名下的那张卡只是一个参考,那我怎么去卡的真实位置……有昵称和类型的部分?
编辑
因此,在其他 SO 帖子、文档和朋友的帮助下,我的代码 90% 正常工作。
我能做的是
1) 找到用户节点下与用户关联的所有card autoID,并将这些字符串存储到数组中#1
2) 我可以查询节点卡下的所有card autoID,然后找到与数组#1 中的内容匹配的那些并将它们存储在数组#2 中(其余的是忽略)
3) **这是我卡住的地方。如果我在 .observe 内部,那么我可以对数组做我想做的事情,比如打印它的内容。但是,如果我在 .observe 之外调用 print ,我什么也得不到......
这是我的代码
func pullCurrentUserCardInfo() {
let userCardsRef = ref.child("users").child((user?.uid)!).child("cards")
userCardsRef.observeSingleEvent(of: .value, with: {(snapshot) in
if let snapDict = snapshot.value as? [String: AnyObject] {
for each in snapDict {
self.usersCardRefArray.append(each.key)
self.count = Int(snapshot.childrenCount)
}
}
})
self.ref.child("cards").observe(.value, with: { (snapshot) in
if snapshot.hasChildren() {
for item in snapshot.value as! [String: AnyObject] {
for test in self.usersCardRefArray {
if test == item.key {
self.allCurrentUsersCards.append(item.key)
}
}
}
} else {
print("no children")
}
})
}
如果我要在函数内部但在 .observe ....}) 之外说以下内容,那么它不会做任何事情.....
for item in allCurrentUsersCards {
print(item)
}
我是否在某处遗漏了一些小东西,或者这与 firebase 有什么关系?
【问题讨论】:
-
基于问题,将结构非规范化到该级别的理由为零。如果子节点的类型与您的示例中的匹配,请将您的用户数据放在用户节点中。除非特定用例有保证,否则没有理由增加复杂性。 (有一些,但在这个例子中没有)
标签: ios swift firebase firebase-realtime-database