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。谁能解释一下这是如何工作的?
答案 0 :(得分:1)
从文档(强调添加)
您还可以使用其他标准撤消管理器功能,例如分组撤消事件。然而,核心数据将撤销注册排队并将其添加到批处理中(这允许框架合并更改,否定相互矛盾的更改,并执行各种其他操作,这些操作在后见之明的情况下比立即工作更好)。如果使用beginUndoGrouping和endUndoGrouping以外的方法,为了确保正确刷新任何排队操作,必须首先向托管对象上下文发送processPendingChanges消息。
根据您没有明确了解的算法,undo
操作正在进行内部优化。
如果您绝对需要完全按顺序撤销订单,则可能需要滚动自己的操作队列,并手动还原FILO(先进先出)订单中的每一个。