如何在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

+0

我刚开始沿着这条路线后,我poste这个问题。我怎样才能知道坐标是不是改变的元素(不保留值在我的应用程序中最后知道)? –

+0

我已经添加了另一个想法,也可以工作,看看你的想法 – Jay

+0

我认为第一种方法适合我,并感觉更清洁,而不是分配给每个用户的观察员。虽然谢谢! –