Firestore能否仅为单个集合开启离线持久化而不作用于其他集合
Firestore按集合配置离线持久化方案
你遇到的报错是因为Firestore的实例配置属于全局生效项,必须在第一次调用该实例的任何方法(比如collection、addDocument、getDocuments等)之前完成设置。你在修改配置前已经调用
Firestore.firestore().collection("posts")初始化了集合引用,相当于已经启动了Firestore实例,因此修改配置触发崩溃。
核心结论
Firestore本身不支持单实例下按集合粒度选择性开启/关闭离线持久化,isPersistenceEnabled是单个Firestore实例的全局配置,一旦开启会对该实例下所有集合的读写操作生效。
可行实现方案
方案1:使用两个独立的Firestore实例
Firestore支持为同一个项目创建多个完全隔离的实例,每个实例可以单独配置持久化开关,是最稳妥的实现方式:
// 1. 带持久化的默认实例,仅用于操作users集合 let persistentFirestore = Firestore.firestore() let COLLECTION_USERS = persistentFirestore.collection("users") // 2. 关闭持久化的独立实例,仅用于操作posts集合 let settings = FirestoreSettings() settings.isPersistenceEnabled = false // 替换为你自己的Firebase项目ID let nonPersistentFirestore = Firestore.firestore(projectID: "你的Firebase项目ID") // 必须在调用实例的任何其他方法前设置配置 nonPersistentFirestore.settings = settings let COLLECTION_POSTS = nonPersistentFirestore.collection("posts")
两个实例连接的是同一个云端数据库,数据完全同步,仅本地缓存策略不同,互不干扰。
方案2:全局开启持久化,查询posts时强制走服务端
如果不想维护多实例,可以全局开启持久化,所有对posts集合的读写操作都强制指定仅从服务端获取,查询结果不会写入本地缓存:
// 所有posts集合的查询都指定source为.server,跳过本地缓存,也不写入缓存 COLLECTION_POSTS.getDocuments(source: .server) { snapshot, error in // 处理查询结果 }
该方案的缺点是需要确保所有操作posts的代码都显式指定服务端来源,漏写就会将数据写入本地缓存。
内容的提问来源于stack exchange,提问作者jamryu
相关产品推荐
相关产品推荐

