检查Firebase实时数据库节点值的相等性并更改它的最有效方法是什么?

时间:2018-03-24 02:58:15

标签: swift firebase firebase-realtime-database

enter image description here

以上是我在Firebase中的实时数据库中的内容。我要做的是检查当前用户的partyStatus是否等于bool为false或true。如果它是假的我想把它改成真。

这是我到目前为止所尝试的:

usersReference.observeSingleEvent(of: .value, with: { (snapshot) in
  if snapshot.hasChild(uid) { 
    //continue another observeSingleEvent for the next value which is "partyStatus" then check the value then change it 
  } 

如何使用Firebase和Swift更有效地完成此操作?

3 个答案:

答案 0 :(得分:1)

您当前的代码加载整个usersReference,然后检查其中是否存在单个子项。

执行相同检查的更有效方法是仅加载该用户的引用,然后检查快照是否存在:

usersReference.child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
  if snapshot.exists() { 
    if snapshot.childSnapshot(forPath: "partyStatus") as! Bool == false {
      usersReference.child(uid).child("partyStatus").setValue(true)
    }
  } 

答案 1 :(得分:1)

以下是一些可以使用的示例代码。

我们在这里做的是检查user_0(partyStatus节点)的特定节点。如果它存在,则获取它的当前值(假设它是bool)然后将其切换(false为true或true为false),如果它不存在,则使用默认值false创建它。

let ref = self.ref.child("users").child("user_0").child("partyStatus")
ref.observeSingleEvent(of: .value, with: { snapshot in
    if snapshot.exists() {
        let isPartying = snapshot.value as! Bool
        ref.setValue(!isPartying)
    } else {
        ref.setValue(false) //it doesn't exist to set to default of false
    }
})
//note that self.ref is a class var ref to my Firebase.

答案 2 :(得分:1)

您是否尝试runTransactionBlock,只需获取值,测试并返回新值:

usersReference.child(uid).child("partyStatus").runTransactionBlock { (data) -> TransactionResult in
        let result = data
        // data = partyStatus value 

        if var value = data.value as? Bool {
           if value == false { // if value is false will change value to true in database
              value = true
              result.value = value 
           } // if not that mean the value is true and will return true
        }

        return TransactionResult.success(withValue: result)
    }

有关runTransaction Firebase Doc的更多信息。