从我读过的关于在Firebase中保留“引用”的文章(1,2,3),我无法理解哪些是如果我们需要侦听所有引用对象的属性,那么引用其他对象的最佳方式。
数据:
我有用户,当他们加入锦标赛时可以扮演玩家的角色:
"t_3515":{
"entry_fee":100,
"status":"Cancelled",
"players":{
"p_3":{
"player_name":"User A",
"score":"0",
"status":"Waiting"
},
"p_4":{
"player_name":"User B",
"score":"0",
"status":"Accepted"
}
}
}
我列出了所有系统的锦标赛。
我必须如何显示此数据:
我正在寻找最佳方式(在性能方面)来构建两个要求的数据。
可能的解决方案1:
为每个玩家复制每个锦标赛,这意味着:
可能的解决方案2:
理论上,这个应用程序将有数以千计的锦标赛和用户,如果我们最终像解决方案1那样重复数据,我想这是需要注意的。
答案 0 :(得分:1)
有许多解决方案,但这里的解决方案非常简单:
给出以下Firebase结构(将分数留下以简化)
tournaments
t_3515
entry_fee:100
status:Active
players
p_3: true
p_4: true
status
P_3: waiting
P_4: accepted
}
}
1)一个屏幕显示/收听“全部”锦标赛列表。
当用户在屏幕上观察所有锦标赛时,请执行以下操作。
ref = tournaments
ref.observeEventType(.Value, withBlock: { snapshot in
print(snapshot)
//note that Value returns the entire contents of the node so this is not
// the best approach. It's here for conceptual. See note below.
})
这将通知应用程序在锦标赛中发生变化的任何节点
2)一个屏幕显示/收听记录用户所属的比赛。
当用户在屏幕上仅观察他们所属的锦标赛时,请执行以下操作:假设用户是p_3并想要查看他们所在的锦标赛:
ref = tournaments
ref.queryOrderedByChild("players/p_3").queryEqualToValue(true)
.observeEventType(.Value, withBlock: { snapshot in
print(snapshot)
})
在屏幕之间切换时,请停止观察先前的。
ref.removeAllObservers
现在,为了向下钻取,您可能不希望使用.Value来附加您的观察者。 .ChildAdded,.ChildChanged和.ChildRemoved将为您提供更好的粒度与实际情况。