繁体   English   中英

ObserveSingleEvent返回旧数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM