跨NSManagedObjectContext传对象报Persistent store不可达错误求助
排查与解决步骤
- 首先确认上下文协调器一致性
崩溃前插入以下代码打印验证,确认View上下文、后台上下文、异常对象所属上下文的持久化协调器为同一个实例:
如果三者不一致,说明运行过程中存在持久化容器重置、存储迁移等操作,当前异常对象是操作前读取的旧实例,与新协调器不匹配导致崩溃。print("viewContext coordinator: \(persistenceController.container.viewContext.persistentStoreCoordinator)") print("backgroundContext coordinator: \(backgroundContext.persistentStoreCoordinator)") print("target object coordinator: \(objectFromViewContext.managedObjectContext?.persistentStoreCoordinator)") - 检查实体存储配置
打开.xcdatamodeld文件,选中异常实体,查看右侧Data Model Inspector面板的Configuration字段,确认与其他正常实体配置一致。如果你为持久化容器挂载了多个持久化存储,需确认该实体绑定的存储确实已挂载到当前容器的协调器。 - 处理临时ID问题
未执行过save操作的新插入对象哪怕是非fault状态,也会持有临时ID,iOS 14的Core Data对跨上下文访问临时ID的处理存在已知异常,可在传递前先强制获取永久ID:if objectFromViewContext.objectID.isTemporaryID { try? objectFromViewContext.managedObjectContext?.obtainPermanentIDs(for: [objectFromViewContext]) } - 替换更安全的上下文取对象方法
原object(with:方法不会校验对象合法性,更容易触发上下文关联异常,换成existingObject(with:)可捕获具体错误,同时避免非法访问:do { let objectInBackground = try backgroundContext.existingObject(with: objectFromViewContext.objectID) } catch { print("对象读取错误详情: \(error)") } - 排查缓存逻辑异常
如果你对该实体对象做了全局缓存,跳过缓存环节,直接在View上下文读取对象后立刻传递到后台上下文验证,若不再崩溃则说明缓存了已失效的ManagedObject实例,需更新缓存逻辑。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

