为什么我的Firebase事务中的currentData总是为零?

Roi*_*lia 4 ios firebase firebase-realtime-database

这就是数据库在Firebase上的呈现方式

Parent
      Match
           User 1
                 Opponent : User 2
                 State    : "NotReady"
           User 2 
                 Opponent : User 1
                 State    : "NotReady"
Run Code Online (Sandbox Code Playgroud)

我正在尝试State使用RunTransaction 更新(每个用户单独)的值.

我想做什么:

  • 检查项目是否已删除(不是nil/null)
  • 如果他存在 - 更新值
  • 如果他不存在 - 操纵UI
  • 如果他突然删除 - 中止事务(可能的情况 - 如果两个关闭事件同时运行,一个更新"状态"和其他删除所有键(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
           }
    
    
            }
        )
    
    Run Code Online (Sandbox Code Playgroud)

但出于某种原因 - 我正在获得currentData,nil直接进入Abort.有什么建议?谢谢!!!

Fra*_*len 5

Firebase使用比较和设置方法进行交易,我将在下面介绍.它解释了为什么你会得到nil,但不幸的是意味着你当前的方法将无法正常工作.

当您调用时runTransactionBlock,Firebase客户端将立即调用您的块,并对该位置的当前值进行最佳猜测.这个最佳猜测可能是正确的,但nil如果它不知道该位置的当前值.

然后,Firebase客户端会发送它为您的块提供的当前值以及您返回给服务器的值.Firebase服务器检查数据库中的当前值是否与客户端的最佳猜测相同.如果是,则写入您指定的新值.如果数据库中的值不同,则服务器拒绝新值,并将拒绝和实际当前值从数据库发送到客户端.

您的块再次被调用,但这次使用关于当前值的新"最佳猜测".

这一直持续到服务器接受操作或者尝试次数太多(我认为是10或25).