Firebase,Swift:`runTransactionBlock()`返回null

每次我运行runTransactionBlock它给我 ,虽然有一个节点在那个位置: –

FIRMutableData(最上面的事务)(null)

在线上: – print(totalPost)

 func updateTotalNoOfPost(){ let prntRef = FIRDatabase.database().reference().child("TotalPosts") prntRef.observeSingleEventOfType(.Value, withBlock: {(totalSnap) in if totalSnap.exists(){ prntRef.child("noOfTotalPost").runTransactionBlock({ (totalPost: FIRMutableData) -> FIRTransactionResult in print(FIRAuth.auth()!.currentUser!.uid)//Giving me correct userID print(totalPost)//<Null> print(prntRef.child("noOfTotalPost"))//Giving me correct path to that node totalPost.value = totalPost.value as! Int + 1 return FIRTransactionResult.successWithValue(totalPost) }, andCompletionBlock: { (err, TF, snap) in print(err?.localizedDescription) print(TF) print(snap!.value) FIRTransactionResult.abort()// Am i using this right? }) }else{ prntRef.setValue(["noOfTotalPost": 1]) } }) } 

我的JSON树结构是这样的: –

  { "TotalPosts" : { "noOfTotalPost" : 1 }, "Users" : { "FBLXPOxBomakPCQuDTilGC7Becu2" : {...}, "1DASWPOxBomakPCdasd1d123au6" : {...},...}} 

我正在使用我的数据库的默认安全规则: –

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

所有我想要的是增加noOfTotalPost子节点的值每次用户创build一个职位: –

我已经有一个使用observeSingleEventOfType.的解决方法observeSingleEventOfType.

  let prntRef = FIRDatabase.database().reference().child("TotalPosts") prntRef.child("noOfTotalPost").observeSingleEventOfType(.Value, withBlock: {(totalSnap) in if totalSnap.exists(){ if let tNo = totalSnap.value as? Int{ prntRef.child("noOfTotalPost").setValue(tNo+1)//Working Fine } }) }else{ prntRef.setValue(["noOfTotalPost": 1]) } }) 

但不能弄清楚为什么runTransactionBlock不会工作!

正如@Frank在评论中所说,预计NSNull最初会返回NSNull行为,但是如果在那个位置已经有一个值,它将会被再次触发。如果在更新值时有冲突,它会再次触发。

码:-

 func updateTotalNoOfPost(completionBlock : (() -> Void)){ let prntRef = FIRDatabase.database().reference().child("TotalPosts") prntRef.child("noOfTotalPost").runTransactionBlock({ (noOfPosts) -> FIRTransactionResult in if let totalPost = noOfPosts.value as? Int{ noOfPosts.value = totalPost + 1 return FIRTransactionResult.successWithValue(noOfPosts) }else{ return FIRTransactionResult.successWithValue(noOfPosts) } }, andCompletionBlock: {(error,completion,snap) in print(error?.localizedDescription) print(completion) print(snap) if !completion { print("The value wasn't able to Update") }else{ completionBlock() } }) } 

对于基本概念: –

交易中的数据为空