CoreData撤消操作顺序,ManagedObjectContext vs手动添加任务

时间:2014-02-27 05:16:49

标签: ios objective-c core-data nsundomanager

CoreData是否控制在给定撤消分组中执行事件的顺序?

简化,我有这样的代码,其中context是NSManagedObjectContext:

[[[context undoManager] prepareWithInvocationTarget:self] a];
MyManagedObject *newMO = [NSEntityDescription insertNewObjectForEntityForName:@"MyManagedObject"    inManagedObjectContext:context];
[[[context undoManager] prepareWithInvocationTarget:self] b];

如果我打印撤消堆栈,它看起来像这样:

0: endUndoGrouping
1: target: NSManagedObjectContext 0x146a89f0 -- selector:_undoInsertions: -- arg:__NSArrayI 0x145bd590
2: target: ViewController 0x146a5470 -- selector:b
3: target: NSManagedObjectContext 0x146a89f0 -- selector:_noop: -- arg:__NSArrayI 0x14638cb0
4: target: ViewController 0x146a5470 -- selector:a
5: beginUndoGrouping

在我的两个自定义撤消调用之间插入noop似乎很奇怪,然后在堆栈之后放置undoInsertions。谁能解释一下这是如何工作的?

1 个答案:

答案 0 :(得分:1)

从文档(强调添加)

  

您还可以使用其他标准撤消管理器功能,例如分组撤消事件。然而,核心数据将撤销注册排队并将其添加到批处理中(这允许框架合并更改,否定相互矛盾的更改,并执行各种其他操作,这些操作在后见之明的情况下比立即工作更好)。如果使用beginUndoGrouping和endUndoGrouping以外的方法,为了确保正确刷新任何排队操作,必须首先向托管对象上下文发送processPendingChanges消息。

根据您没有明确了解的算法,undo操作正在进行内部优化。

如果您绝对需要完全按顺序撤销订单,则可能需要滚动自己的操作队列,并手动还原FILO(先进先出)订单中的每一个。

相关问题