Iphone 撤消核心数据管理对象

Iphone 撤消核心数据管理对象,iphone,objective-c,ios,core-data,Iphone,Objective C,Ios,Core Data,我有以下代码: Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store"]; store.name = @"My Company" ... 现在,存储是在上下文中管理的,并且在保存上下文时将被保存,但是我有一个按钮,用户可以在其中取消收集数据的表单。如何从上下文中撤消或删除此内容?还是我想的不对?您也可以将用户的所有数据保存在一个数组中,当用户准备好后,您只需将数组保存到核心数据。核心数据已经保存,

我有以下代码:

Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store"];
store.name = @"My Company"
...

现在,存储是在上下文中管理的,并且在保存上下文时将被保存,但是我有一个按钮,用户可以在其中取消收集数据的表单。如何从上下文中撤消或删除此内容?还是我想的不对?

您也可以将用户的所有数据保存在一个数组中,当用户准备好后,您只需将数组保存到核心数据。

核心数据已经保存,因此您可以通过向上下文发送
-undo
消息来撤消单个更改:

[store.managedObjectContext rollback];
[store.managedObjectContext undo];
它还支持
-redo
。您可以使用
-rollback
方法撤消直到最近保存的所有更改:

[store.managedObjectContext rollback]

如@melsam的回答所示。

如前所述,您可以使用撤销管理器。或者,您可以简单地使用单独的ManagedObjectContext,并在其中执行所有更改。如果您决定保留它们,请保存上下文。如果没有,干脆丢弃它。MOC只是工作的一个便笺簿,在保存之前不会影响底层数据库

您不能真正地“分离实体”,但您可能会导致托管对象变回故障,丢失所有尚未保存的更改

[managedObjectContext refreshObject:object mergeChanges:NO];
从文档中剪下

若标志为“否”,那个么对象将变成一个故障,并且任何挂起的 更改丢失。在访问该对象之前,该对象一直是一个故障 同样,此时它的属性值将从 存储或上次缓存状态


Undo
仅在我创建
undoManager
(Swift 5)时有效:

完成此配置后,您可以撤消最后一次更改:

managedObjectContext.undo()

撤消和回滚之间有什么区别?最常使用的是什么?@Dude前者会撤销一次更改,后者会撤销上一次保存之前的所有更改。你看过我链接的文档了吗?这会有帮助的。另请阅读中的撤消方法。我刚刚意识到您的问题已被标记,因此请注意文档中的注释,其中指出您需要设置上下文的撤消管理器以启用撤消支持。但是如果您使用撤消,代码中是否可能有其他地方将某些内容保存到上下文中,因此当您说“撤消”时,可能会撤消错误的更改?当您有对某个实体的引用时,是否没有简单的方法可以从上下文中删除该实体?@Dude您当然可以删除该对象。但是,托管对象仅在托管对象上下文中才有意义,因此您不能“分离”它,而仍然拥有一个可用的对象。
managedObjectContext.undo()