CoreData是否控制在给定撤消分组中执行事件的顺序?
简化后,我有这样的代码,其中上下文是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会放在堆栈上。有人能解释一下这是怎么回事吗?
从文档(增加强调)
您还可以使用其他标准的撤消管理器功能,例如对撤消事件进行分组。不过,核心数据会将撤消注册排队并批量添加(这允许框架合并更改,否定矛盾的更改,并执行各种其他操作,这些操作在事后比即时更有效)。如果使用beginUndoGrouping和endUndoGroupation以外的方法,为了确保正确刷新任何排队的操作,必须首先向托管对象上下文发送processPendingChanges消息。
在引擎盖下,undo
操作正在根据一种您没有明确了解的算法进行一些内部优化。
如果您绝对需要精确的顺序反转,那么您可能必须滚动自己的操作队列,并以FILO(先进先出)顺序手动还原每个操作。