缓存通常会满足我们的第一个FireStore快照侦听器结果,几乎总是使用过时的数据(显然)。侦听器经常在此后立即再次触发并丢失结果。
使用FireStore设置将isPersistenceEnabled设置为false不会阻止缓存结果返回。我是否需要清除已经建立的缓存?
当检查snap.metadata.isFromCache时,缓存显然仍在运行。
在当前嵌入VC时禁用持久性没有任何作用(容器视图):
vc?.db = Firestore.firestore()
let settings = FirestoreSettings()
settings.isPersistenceEnabled = false
vc?.db?.settings = settings
一些代码:
var isFirstQuery = true
queuesInLocationRef?.remove()
queuesInLocationRef = db?.collection("location").whereField("city", isEqualTo: city).whereField("region", isEqualTo: region).addSnapshotListener({ (snapshot, error) in
guard let snap = snapshot else {
print("watch location err: ", error!)
return
}
self.processDocumentChanges(documentChanges: snap.documentChanges, isFirstQuery: isFirstQuery)
isFirstQuery = false
})
第一次开听者时,我有重要的事情要做。当我有Internet连接时,通常会首先使用陈旧的缓存结果来触发,因此我想排除在外。我尝试检查isFromCache并尽早返回,但发现即使建立了网络连接,最新的结果也可能会从缓存中返回。这导致侦听器不再触发。
如果缓存的结果再也不会回来,那就顺风顺水了。我不确定iOS SDK中的禁用持久性功能是什么,但这在这里无济于事。
通过告诉SDK传递元数据更改事件来解决您正在描述的内容。确保彻底阅读该文档。
注册元数据更改时,如果元数据中的某些内容(包括数据源)发生更改(即使文档数据完全没有更改),则将调用回调。通过这种方法,您可以检查服务器上的数据是否绝对是最新的-snapshot.metadata.isFromCache
应该返回false。
要请求元数据更改,请像这样调用addSnapshotListener:
query.addSnapshotListener(includeMetadataChanges: true) { documentSnapshot, error in
// ...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句