【问题标题】:Will NSUndoManager undo changes happening in the background?NSUndoManager 会撤消后台发生的更改吗?
【发布时间】:2012-12-03 14:56:55
【问题描述】:

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

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

【问题讨论】:

  • +1 你找到答案了吗?
  • 不,很遗憾没有:(仍然很好奇,因为它有可能造成很大的损害

标签: objective-c ios cocoa-touch core-data nsundomanager


【解决方案1】:

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

编辑: 这是一个小代码 sn-p ,您可以在单独的上下文中同步而无需创建撤消操作

// 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];

【讨论】:

  • 啊,好吧,只要我的撤消调用在同步内容的单独撤消组中,那么它们就会分开?
  • 是的,但出现了两个问题。您应该能够撤消同步带来的更改吗?如果没有,撤消操作是否可以部分取消同步的更改。
  • 没有同步应该不能被撤消管理器撤消,撤消操作不能改变同步中的任何内容。如果用户正在编辑一条实际上正在同步的记录,然后他们撤消了,它应该简单地返回到原来的状态,或者在刚刚被同步更新的情况下返回到现在的状态
  • 如果用户不应该能够撤消同步的更改,那么您必须在同步后清除撤消堆栈。这样,用户只能撤消对最新同步的更改。
  • 但是,如果在同步过程中将内容添加到撤消堆栈中会发生什么?同步将更新许多记录而不仅仅是一个,因此如果它添加了一些更改,那么用户开始编辑然后撤消,那么它不会开始撤消同步更改吗?有没有办法不将同步更改添加到撤消堆栈,或者无论如何都不会自动发生?如果在对象上下文中使用取消管理,我不确定它是否会自行发生
猜你喜欢
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2013-07-29
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多