使用时:
func setValue(value: AnyObject?, withCompletionBlock block: (NSError?, FIRDatabaseReference) -> Void)
作为Firebase iOS sdk的一部分,在启用持久性时,将不一致地调用完成块。
我意识到如果没有网络连接并且它将在本地更新并且仅在将数据发送到服务器时调用完成,则不应调用完成,但是我可以观察在firebase控制台和我调用的完成块仍然不一致。
如果我关闭persistanceEnabled
,则通话将按预期运行。
这是我的方法。 ref是FIRDatabaseReference
,json
是json的对象表示
func lightSave(completion: FBModelUpdateCompletion? = nil) {
print("Light Saving \(ref)")
ref.setValue(json, withCompletionBlock: { (error, result) in
print("finished saving")
if let error = error {
print(error.localizedDescription)
}
completion?(error: error, object: self)
})
}
答案 0 :(得分:0)
“我意识到如果没有网络连接,就不应该调用完成”
事实并非如此 - 当没有网络连接且您已启用persistenceEnabled
时,完成功能块也会被调用。
这里的理由是,您应该让Firebase数据库成为您应用中真正的数据来源,如果您需要连接并且依赖数据库更新,则必须开始担心或者如果你不是手动管理它,事情会变得混乱。
因此,如果您未连接到数据库但已打开persistenceEnabled,Firebase会将“我正在将数据更新到本地缓存以便稍后保存”,就像在线数据库本身已更新一样,因此,您可以继续将Firebase参考视为准确的数据来源。