[英]ObserveSingleEvent returns old data
我想在应用启动时获取所需的应用版本号。 但是我找不到正确的钥匙。
我有要获取的代码。 我使用观察单个事件,因为我使用此方法检查所需的应用程序版本号。 仅当应用开始执行检查时才会触发此方法。
func getVersion(completionHandler: @escaping (Result<Any?>) -> ()) {
let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS")
ref?.observeSingleEvent(of: .value , with: { snapshot in
if snapshot.exists() {
let recent = snapshot.value as! NSDictionary
print(recent)
}
})
}
但是它正在返回旧结果吗? 我在isPersistenceEnabled
启用了Appdelegate
。
这是数据库结构:
当我使用Database.database().reference().child("version").child("IOS").
时,没有任何结果Database.database().reference().child("version").child("IOS").
当我使用snapshot.exists时,它为false。
我以前拥有的是:-版本| iOS-1.0
当我使用Database.database().reference().child("version"), namely {iOS => 1.0}
时,我得到结果。 我不明白,因为那是我的旧结构。
Firebase实时数据库为活动侦听器同步并存储数据的本地副本。 此外,您可以使特定位置保持同步。
let scoresRef = Database.database().reference(withPath: "scores")
scoresRef.keepSynced(true)
即使引用没有活动的侦听器,Firebase Realtime Database客户端也会自动在这些位置下载数据并保持同步。 您可以使用以下代码行关闭同步。
scoresRef.keepSynced(false)
还没有真正尝试过,但是应该可以。
observeSingleEvent
方法用于真正不变的数据,因此,如果启用了持久性,它将从本地缓存中获取。
此Android解决方案( https://stackoverflow.com/a/40477280/883413 )通过使用替代方法runTransactonBlock
提供了一种解决方法。
事务使您有机会在保存任何数据之前对其进行编辑。 在这里,我们只接受读取最新值,就可以接受正确的数据。
let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS")
ref.runTransactionBlock({ (data) -> TransactionResult in
return TransactionResult.success(withValue: data)
}, andCompletionBlock: { (error, success, snapshot) in
if let snapshot = snapshot, snapshot.exists() {
if let recent = snapshot.value as? NSDictionary {
print(recent)
}
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.