我的Firebase数据库中有一个“用户”节点。其中的每个用户都有一个带有uid的root用户。每个用户的一个属性是“坐标”。我想观察所有用户的任何坐标的任何变化。我几乎需要这样的东西:
usersDatabaseReference.child("*").child("coordinates").observe(.value, with: { (snapshot) in
我的结构如下:
用户
abcdefghijklmnop
坐标:“12.345,12.345”
其他道具
qrstuvwxyz
坐标:“34.567,34.567”
其他道具
所以我正在寻找坐标值发生变化的任何用户的全局通知。
我是否需要遍历userDatabaseReference中的所有子节点并为每个子节点设置观察者?然后,无论何时添加或删除用户,都要重新设置它?
你可以看到我为什么要使用通配符。我该怎么做呢?
答案 0 :(得分:6)
您可以只观察用户结构,然后使用快照来确定坐标是否是已更改的元素
usersDatabaseReference.child("users").observe(.childChanged, with: { (snapshot) in
//Determine if coordinate has changed
})
你还可以做的是:
func observeChildAdded(){
usersDatabaseReference.child("users").observe(.childAdded, with: { (snapshot) in
//Get the id of the new user added
let id = "123"
self.usersDatabaseReference.child("users").child(id).observe(.childChanged, with: { (snapshot) in
self.foundSnapshot(snapshot)
})
})
}
func foundSnapshot(_ snapshot: DataSnapshot){
let idChanged = snapshot.key
//Process new coordinates
}
因此,每当你添加一个新子时,它会自动为它设置一个观察者,但它们都被推送到同一个函数foundSnapshot