Objective c NSUndoManager会撤消后台发生的更改吗?

Objective c NSUndoManager会撤消后台发生的更改吗?,objective-c,ios,cocoa-touch,core-data,nsundomanager,Objective C,Ios,Cocoa Touch,Core Data,Nsundomanager,我有一个编辑视图控制器,我正在使用NSUndoManager,它是为我的持久性存储(核心数据项目)设置的 我的应用程序的一个功能是与外部服务器同步。我想知道的是,如果我在我的视图中编辑某个内容,同时应用程序正在与服务器同步,如果我改变主意并决定撤消当前编辑中的任何更改,它是否还会撤消同步过程中所做的所有更改,如果这些更改是在撤消分组启动时进行的,还是只撤销我自己做的更改?取决于您的实现。通常,撤消管理器会为事件打开一个撤消组并封装更改,请参见groupsByEvent。如果使用辅助托管对象上下文

我有一个编辑视图控制器,我正在使用NSUndoManager,它是为我的持久性存储(核心数据项目)设置的


我的应用程序的一个功能是与外部服务器同步。我想知道的是,如果我在我的视图中编辑某个内容,同时应用程序正在与服务器同步,如果我改变主意并决定撤消当前编辑中的任何更改,它是否还会撤消同步过程中所做的所有更改,如果这些更改是在撤消分组启动时进行的,还是只撤销我自己做的更改?

取决于您的实现。通常,撤消管理器会为事件打开一个撤消组并封装更改,请参见groupsByEvent。如果使用辅助托管对象上下文进行后台同步,并将该上下文合并回主上下文 您必须确保禁用了撤消注册,请参阅disableUndoRegistration

编辑: 下面是一个小代码段,您可以使用它在单独的上下文中进行同步,而无需创建撤消操作

// create a child context with no undo manager
NSManagedObjectContext *context = [NSManagedObjectContext contextWithParent:self.managedObjectContext];
context.undoManager = nil;

[... do your synchronization with the child context...]

// merge into main context without generating undo actions
[undoManager disableUndoRegistration];
[context save:&error];
[managedObjectContext processPendingChanges];
[undoManager enableUndoRegistration];

// to prevent undo action beyond the synchronization to remove all undo actions
[undoManager removeAllActions];

+1你找到答案了吗?没有:(仍然很奇怪,因为它可能会造成很多破坏啊,好吧,只要我的撤销调用在一个单独的同步组中,那么它们就会是单独的吗?是的,但会出现两个问题。你是否能够撤销同步所带来的更改?如果不能,撤销操作能否部分取消同步的更改。否“撤消管理器”不应撤消同步,撤消操作也不应更改同步中的任何内容。如果用户正在编辑一条实际上正在同步的记录,然后他们撤消,则应简单地返回到该记录以前的状态,或者返回到现在由syn更新的状态计时如果用户不能撤消对同步所做的更改,则必须在同步后清除撤消堆栈。这样,用户只能撤消对最新同步所做的更改。但是,如果在同步过程中向撤消堆栈添加了内容,会发生什么情况?同步将更新大量内容记录不只是一个,因此,如果它添加了几个更改,那么用户开始编辑,然后撤消,那么它不会开始撤消同步更改吗?有没有办法不将同步更改添加到撤消堆栈中,或者这不会自动发生?如果在对象上下文中使用undomanage,我不确定它是否自行发生