我想在应用启动时获取所需的应用版本号。但我无法获得正确的密钥。
我有这个代码来获取。我使用observe单个事件,因为我使用此方法来检查所需的应用程序版本号。只有在应用程序开始执行检查时才会触发此方法。
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").
时,我没有得到任何结果
我使用它时,snapshot.exists为false。
我以前拥有的是: - 版本 | IOS - 1.0
当我使用Database.database().reference().child("version"), namely {iOS => 1.0}
时,我得到了结果。我不明白,因为这是我原来的结构。
答案 0 :(得分:2)
Firebase实时数据库同步并存储活动侦听器的本地数据副本。此外,您可以保持特定位置同步。
let scoresRef = Database.database().reference(withPath: "scores")
scoresRef.keepSynced(true)
Firebase实时数据库客户端会自动在这些位置下载数据并使其保持同步,即使引用没有活动侦听器也是如此。您可以使用以下代码行关闭同步。
scoresRef.keepSynced(false)
Haven没有尝试过,但它应该有用。
答案 1 :(得分:0)
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)
}
}
})