在这个应用程序中,每个用户都有一个“投票”计数器,但只有在同一个用户投票时才有效,当另一个用户试图在该参考中进行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)
})
答案 0 :(得分:1)
最初运行事务处理程序时客户端的最佳猜测是当前值。通常这将是nil
,因此您的代码必须处理它。
注意:由于多次调用
runTransactionBlock:andCompletionBlock:
,因此必须能够处理nil
数据。即使远程数据库中存在现有数据,在运行事务函数时也可能无法在本地缓存该数据,从而导致初始值为nil
。
这样的事情应该适合你的情况:
let value = currentData.value as? Int ?? 0