如何在Swift中的多个节点中观察Firebase子值的变化?

时间:2017-07-18 13:59:33

标签: ios swift firebase firebase-realtime-database observers

我的Firebase数据库中有一个“用户”节点。其中的每个用户都有一个带有uid的root用户。每个用户的一个属性是“坐标”。我想观察所有用户的任何坐标的任何变化。我几乎需要这样的东西:

usersDatabaseReference.child("*").child("coordinates").observe(.value, with: { (snapshot) in 

我的结构如下:

  • 用户

    • abcdefghijklmnop

      • 坐标:“12.345,12.345”

      • 其他道具

    • qrstuvwxyz

      • 坐标:“34.567,34.567”

      • 其他道具

所以我正在寻找坐标值发生变化的任何用户的全局通知。

我是否需要遍历userDatabaseReference中的所有子节点并为每个子节点设置观察者?然后,无论何时添加或删除用户,都要重新设置它?

你可以看到我为什么要使用通配符。我该怎么做呢?

1 个答案:

答案 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