火力地堡。如何将数据保存为事务而不覆盖现有数据,但更新它? Swift3

时间:2017-07-08 00:13:13

标签: ios swift firebase firebase-realtime-database

是否可以将数据保存为事务as per firebase docs,但不会覆盖整个节点?我想知道在调用updateChildValues时是否有runTransactionBlock的等效内容。我在runTransactionBlock文档中看到的唯一选项是覆盖/ path / somepath中的现有数据。
请提供替代方案,或者如果我在这里错误的道路上,我会感谢您的建议,我不应该关键:对现有数据的价值。

2 个答案:

答案 0 :(得分:2)

运行事务时,将使用该位置中的现有数据调用回调/处理程序。因此,您所做的只是更新要修改的属性,并从回调/处理程序中返回该组合。

无法告诉客户端要更新哪些属性。但是,由于您的处理程序是使用其更新位置的现有值调用的,因此不会导致代码效率低下。

如果您无法完成此项工作,请发布single, minimal-but-complete code snippet that reproduces the problem

答案 1 :(得分:1)

诀窍是检查返回值,如果返回值不为nil则附加初始值,否则将其更新,

articleRef.runTransactionBlock({ (currentData: MutableData) -> TransactionResult in if var viewInfo = currentData.value as? [String : AnyObject] { var viewCount = viewInfo["viewCount"] as? Int ?? 0 viewCount += 1 viewInfo["viewCount"] = viewCount as AnyObject? //Set value and report transaction success currentData.value = viewInfo return TransactionResult.success(withValue: currentData) } else { //Iarticle doesnt exists, add inital value currentData.value = ["viewCount": 1] } return TransactionResult.success(withValue: currentData) }) { (error, committed, snapshot) in if let error = error { print(error.localizedDescription) } }