CoreData如何从子Managed Object Context中仅保存指定临时实体并丢弃其余变更?
Child 托管对象上下文(MOC)场景下单实体持久化方案
你可以通过两种成熟方案实现仅保存指定临时实体、丢弃其余变更的需求:
方案1:迁移目标实体后重置上下文
该方案性能最优,适合临时对象数量较多的场景:
- 先完成目标实体的所有属性修改,调用
obtainPermanentIDs(for:)为其申请永久ID,避免后续跨上下文访问时出现ID失效问题
// Swift 示例 do { try childMOC.obtainPermanentIDs(for: [targetObject]) } catch { // 处理ID申请异常 }
- 调用
childMOC.reset()清空上下文内所有未提交的变更,此时所有临时创建的托管对象都会被丢弃,仅目标实体的永久ID仍然有效 - 通过永久ID在child MOC中重新获取目标对象,确认状态无误后执行
save()操作,此时上下文仅会提交该实体的变更,其余变更已经被完全清除
方案2:手动删除其余临时对象
该方案操作更简便,适合临时对象数量较少的场景:
- 遍历child MOC的新增、更新对象集合,排除需要保留的目标实体后,将其余所有临时对象标记为删除
// Swift 示例 var discardObjects = Set<NSManagedObject>() discardObjects.formUnion(childMOC.insertedObjects) discardObjects.formUnion(childMOC.updatedObjects) discardObjects.remove(targetObject) discardObjects.forEach { childMOC.delete($0) }
- 正常调用
childMOC.save()即可,此时仅目标实体会被持久化,其余被标记删除的临时对象不会写入存储层,上下文销毁后会自动释放
注意:所有对托管对象上下文的操作都需要放在对应队列的
perform/performAndWait闭包中执行,避免线程安全问题。
内容的提问来源于stack exchange,提问作者Aykhan Hagverdili
相关产品推荐
相关产品推荐

