可以使用observeSingleEvent + persistence启用最新数据吗?

时间:2017-11-16 13:58:16

标签: swift firebase

我正在尝试从firebase获取一些数据。任何想法,当我启用持久性时,如何获取最新数据(而不是缓存)?我试过keepSynced;我仍然得到过时的数据。这是正确的用法吗?

userRef = FIRDatabase.database().reference().child("<path>")
userRef.keepSynced(true)
userRef.observeSingleEvent(of: .value, with: { snapshot in
   ...stale data here...
})

或唯一的选择是使用observe而不是observeSingleEvent?我不喜欢这样的事实:通过观察,我首先获得缓存数据,然后事件再次触发来自服务器的数据。所以使用observe,当我导航到这个屏幕时,首先我看到一个空白表,然后我看到带有陈旧数据的表,然后我看到了包含最新数据的表。

感谢。

编辑:

https://stackoverflow.com/a/34487195/1373592 - 这篇文章说keeySynced应该工作。但这对我不起作用。我想知道我做错了什么。

2 个答案:

答案 0 :(得分:0)

我检索了一些解释,我认为它可能对你有所帮助:

  

如果使用Firebase,则带有keepSycned的ObserveSingleEventType将不起作用   连接无法按时建立。这尤其如此   在appLaunch期间或appDelegate中有延迟   而是给出Firebase连接和缓存结果。 会的   如果启用持久性并且有时也不起作用   observeSingleEvent可能会先提供缓存数据。在情况下   像这样,连续的ObserveEventType是首选,应该是   如果您绝对需要新数据,请使用。

我认为你没有选择使用连续的监听器。但是为了避免出现性能问题,为什么当你不再使用它时,你不会将自己移除给自己。

答案 1 :(得分:0)

以下是打开持久性时如何始终从Firebase获取最新数据的示例。如果您不想一直保留它,请使用observe event,在您的ref上保持keepSynced并终止侦听器。经过几次试验,我想出了这个方法,它正在起作用。

func readFromFB() {
    let refHandle: DatabaseHandle?
    let ref: DatabaseReference? = firebase.child(nodeName)
    ref?.keepSynced(true)

    refHandle = ref!.observe(.value, with:
     { snapshot in
        if snapshot.exists() {
            for item in ((snapshot.value as! NSDictionary).allValues as Array) {
                //do whatever tasks
            }
        }
    })
    if let rf = ref {
        rf.removeObserver(withHandle: refHandle!)
    }
}