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