为什么我的 Firebase 事务中的 currentData 始终为零?
Why is the currentData in my Firebase transaction always nil?
这是数据库在 Firebase 上的呈现方式
Parent
Match
User 1
Opponent : User 2
State : "NotReady"
User 2
Opponent : User 1
State : "NotReady"
我正在尝试使用 RunTransaction 更新 State
(每个用户单独)的值。
我试图做的事情:
- 检查该项目是否未删除(不是 nil/null)
- 如果他存在 - 更新值
- 如果他不存在-操纵UI
如果他突然删除了——中止事务(可能的情况——如果两个关闭事件运行同时发生,一个更新"State",另一个删除所有键(removeValue)
let path = "Parent/Match/User 1/state"
let futureRef = Firebase(url: path)
futureRef.runTransactionBlock({
(currentData:FMutableData!) in
let value = currentData.value as? String
if value != nil {
currentData.value = "Ready"
return FTransactionResult.successWithValue(currentData)
}
return FTransactionResult.abort()
}, andCompletionBlock: {
// Completion Check
(error:NSError!, success:Bool, data:FDataSnapshot!) in
if error == nil && success && data.value as! String == "Ready"
{
//Value is not null(not removed) and he is ready
ManipulateUI()
}
else
{
//Value deleted
}
}
)
但出于某种原因 - 我正在获取 nil
的 currentData 并直接转到 Abort
。 有什么建议吗?谢谢!!!
Firebase 使用 compare-and-set 交易方法,我将在下面进行描述。它解释了为什么您会得到 nil
,但不幸的是,这意味着您当前的方法将行不通。
当您调用 runTransactionBlock
时,Firebase 客户端将立即调用您的块,并根据其对位置当前值的最佳猜测。这个最佳猜测可能是正确的,但如果它不知道该位置的当前值,它将是 nil
。
然后 Firebase 客户端发送它给你的块的当前值和你返回给服务器的值。 Firebase 服务器检查数据库中的当前值是否与客户端的最佳猜测相同。如果是这样,它会写入您指定的新值。如果数据库中的值不同,则服务器拒绝新值并将拒绝和数据库中的实际当前值发送给客户端。
您的块再次被调用,但这次使用新的 "best guess" 作为当前值。
这一直持续到服务器接受操作或尝试次数过多(我认为是 10 或 25 次)。
这是数据库在 Firebase 上的呈现方式
Parent
Match
User 1
Opponent : User 2
State : "NotReady"
User 2
Opponent : User 1
State : "NotReady"
我正在尝试使用 RunTransaction 更新 State
(每个用户单独)的值。
我试图做的事情:
- 检查该项目是否未删除(不是 nil/null)
- 如果他存在 - 更新值
- 如果他不存在-操纵UI
如果他突然删除了——中止事务(可能的情况——如果两个关闭事件运行同时发生,一个更新"State",另一个删除所有键(
removeValue)
let path = "Parent/Match/User 1/state" let futureRef = Firebase(url: path) futureRef.runTransactionBlock({ (currentData:FMutableData!) in let value = currentData.value as? String if value != nil { currentData.value = "Ready" return FTransactionResult.successWithValue(currentData) } return FTransactionResult.abort() }, andCompletionBlock: { // Completion Check (error:NSError!, success:Bool, data:FDataSnapshot!) in if error == nil && success && data.value as! String == "Ready" { //Value is not null(not removed) and he is ready ManipulateUI() } else { //Value deleted } } )
但出于某种原因 - 我正在获取 nil
的 currentData 并直接转到 Abort
。 有什么建议吗?谢谢!!!
Firebase 使用 compare-and-set 交易方法,我将在下面进行描述。它解释了为什么您会得到 nil
,但不幸的是,这意味着您当前的方法将行不通。
当您调用 runTransactionBlock
时,Firebase 客户端将立即调用您的块,并根据其对位置当前值的最佳猜测。这个最佳猜测可能是正确的,但如果它不知道该位置的当前值,它将是 nil
。
然后 Firebase 客户端发送它给你的块的当前值和你返回给服务器的值。 Firebase 服务器检查数据库中的当前值是否与客户端的最佳猜测相同。如果是这样,它会写入您指定的新值。如果数据库中的值不同,则服务器拒绝新值并将拒绝和数据库中的实际当前值发送给客户端。
您的块再次被调用,但这次使用新的 "best guess" 作为当前值。
这一直持续到服务器接受操作或尝试次数过多(我认为是 10 或 25 次)。