我正在尝试从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应该工作。但这对我不起作用。我想知道我做错了什么。
答案 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!)
}
}