如何在Core Data中不保存上下文就删除新建的托管对象?
解决Core Data未保存对象无法从上下文移除的问题
问题根源
你创建的ListOfTasks是未被持久化的新对象(还没执行过save(),没有生成持久化ID),此时调用context.delete(list)只是给对象打上"待删除"标记,但只要不执行save(),这个标记删除的对象依然会留在视图上下文里——Core Data对未持久化的对象,delete操作不会直接将其从上下文移除。
正确处理方式
针对用户取消操作的场景,不需要调用delete,直接用refresh(_:mergeChanges:)方法就能把未保存的对象从上下文移除,完全不需要执行save():
let context = PersistenceController.viewContext let list = ListOfTasks(context: context) // 刷新对象,mergeChanges设为false,让上下文停止跟踪该对象 context.refresh(list, mergeChanges: false) // 验证对象是否已移除 if context.registeredObjects.contains(list) { print("对象仍在上下文中") } else { print("对象已从上下文移除") } // 无需执行save(),因为对象从未被持久化到存储中
额外说明
- 如果对象已经被保存过(执行过
save()),此时才需要用context.delete(list)+save()的组合彻底删除。 - 对于未保存的临时对象,
refresh(_:mergeChanges:)是最高效的处理方式,它会直接切断上下文与对象的关联,对象会在无其他强引用时被系统释放。
内容的提问来源于stack exchange,提问作者Ammar Ahmad
相关产品推荐
相关产品推荐

