以上是我在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更有效地完成此操作?
答案 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的更多信息。