Firebase 3无法修改其他用户创建的数据

时间:2016-06-07 18:04:42

标签: swift firebase firebase-realtime-database firebase-security

在这个应用程序中,每个用户都有一个“投票”计数器,但只有在同一个用户投票时才有效,当另一个用户试图在该参考中进行FIRTransaction时,它返回nil。规则设置为任何用户 当我需要user2更新user1“votes”值时,它不会读取该键值来执行事务块,因此返回nil。

votesCountRef = ref.child("user1").child("votes")
votesCountRef.runTransactionBlock( { (currentData) -> FIRTransactionResult in
            let value = currentData.value! as! Int
            currentData.value = value + 1
            return FIRTransactionResult.successWithValue(currentData)
        })

结果:

  

收到投票实际价值:可选()   无法将'NSNull'(0x110684600)类型的值转换为'NSNumber'(0x10fce92a0)。

但是当原始用户运行时,它可以成功运行。

user1的Json树:

{ 
  "userUID" : "user1",
  "votes" : 2
}  

数据库规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}  

感谢@Frank,我可以像这样管理它:

    ownerReceivedVotesCountRef.runTransactionBlock( { (currentData) -> FIRTransactionResult in

    let value = currentData.value as? Int ?? 0
    currentData.value! = (value as Int) + 1
    return FIRTransactionResult.successWithValue(currentData)
})

1 个答案:

答案 0 :(得分:1)

最初运行事务处理程序时客户端的最佳猜测是当前值。通常这将是nil,因此您的代码必须处理它。

来自Firebase documentation

  

注意:由于多次调用runTransactionBlock:andCompletionBlock:,因此必须能够处理nil数据。即使远程数据库中存在现有数据,在运行事务函数时也可能无法在本地缓存该数据,从而导致初始值为nil

这样的事情应该适合你的情况:

let value = currentData.value as? Int ?? 0