如何在Swift中的多个节点上观察Firebase子值更改?
问题描述:
我的Firebase数据库中有一个“用户”节点。其中的每个用户都有一个带有uid的根。每个用户的属性之一是“坐标”。我想观察所有用户的任何坐标变化。我几乎需要这样的东西:如何在Swift中的多个节点上观察Firebase子值更改?
usersDatabaseReference.child("*").child("coordinates").observe(.value, with: { (snapshot) in
我的结构是这样的:
-
用户
-
abcdefghijklmnop
坐标: “12.345,12.345”
等道具
-
qrstuvwxyz
坐标: “34.567,34.567”
等道具
-
所以我正在寻找任何用户的坐标值变化的全球通知。
我是否需要遍历我的userDatabaseReference中的所有子节点并为每个子节点设置观察者?然后,无论何时添加或删除用户,都要重新设置它?
你可以看到为什么我想使用通配符。我应该如何处理这个问题?
答
你可以只观察用户结构作为一个整体,然后使用快照,以确定是否坐标值已经改变的元素
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
我刚开始沿着这条路线后,我poste这个问题。我怎样才能知道坐标是不是改变的元素(不保留值在我的应用程序中最后知道)? –
我已经添加了另一个想法,也可以工作,看看你的想法 – Jay
我认为第一种方法适合我,并感觉更清洁,而不是分配给每个用户的观察员。虽然谢谢! –