如何无需异步快照本地检查Firestore缓存文档是否存在?
Firestore本地缓存存在性检查优化方案
手动维护本地缓存标记
首次成功拉取并缓存Firestore文档后,用UserDefaults或者本地文件存一个简单标记(比如hasFirestoreCache),把值设为true。之后启动App时直接同步读这个标记,就能快速判断本地有没有缓存文档,完全不用走异步的快照请求。
示例代码:// 缓存成功后设置标记 UserDefaults.standard.set(true, forKey: "hasFirestoreCache") // 启动时同步检查 let hasLocalCache = UserDefaults.standard.bool(forKey: "hasFirestoreCache") if hasLocalCache { // 存在缓存,走缓存逻辑 } else { // 无缓存,从网络拉取 }要注意:如果之后有清空缓存的操作,记得同步把这个标记改成
false,避免判断出错。直接检查Firestore缓存文件路径
Firestore在iOS上的本地缓存有固定存储目录,你可以用FileManager同步检查这个目录下有没有文件。大致路径是~/Library/CloudKit/com.google.firebase.firestore/[你的项目ID]/persistence,直接判断目录是否存在且非空就行。
示例代码:func hasFirestoreLocalCache() -> Bool { guard let appID = FirebaseApp.app()?.options.projectID else { return false } let cachePath = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask) .first? .appendingPathComponent("CloudKit") .appendingPathComponent("com.google.firebase.firestore") .appendingPathComponent(appID) .appendingPathComponent("persistence") guard let path = cachePath?.path else { return false } let fileManager = FileManager.default var isDirectory: ObjCBool = false if fileManager.fileExists(atPath: path, isDirectory: &isDirectory), isDirectory.boolValue { do { let contents = try fileManager.contentsOfDirectory(atPath: path) return !contents.isEmpty } catch { return false } } return false }提醒一下:这个路径可能会随Firestore SDK版本更新变化,需要自己测试确认,而且不同平台(比如iOS和macOS)的路径可能不一样。
内容的提问来源于stack exchange,提问作者Nicholas Farmer
相关产品推荐
相关产品推荐

