ObserveSingleEvent返回旧数据

时间:2017-07-28 13:22:03

标签: ios swift firebase firebase-realtime-database

我想在应用启动时获取所需的应用版本号。但我无法获得正确的密钥。

我有这个代码来获取。我使用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

这是数据库结构:

enter image description here

当我使用Database.database().reference().child("version").child("IOS").时,我没有得到任何结果 我使用它时,snapshot.exists为false。

我以前拥有的是: - 版本     |     IOS - 1.0

当我使用Database.database().reference().child("version"), namely {iOS => 1.0}时,我得到了结果。我不明白,因为这是我原来的结构。

2 个答案:

答案 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)
        }
    }
})