我有一个基于 Cocoa 文档的应用程序,并且在使用 NSUndoManager 时遇到了一些问题,即使我让 Core Data 处理了所有这些问题。
因此,每次创建新的持久文档时,我都会创建一个根上下文和一个子上下文。根上下文负责写入持久文档,子上下文是我通过创建/编辑/删除 NSManagedObjects 修改的上下文。我将根上下文设置为父上下文。我还将子上下文的撤消管理器设置为使用 NSPersistentDocument 创建的原始上下文。这里有一些代码,希望能使它更清楚一点:
// create root context
NSManagedObjectContext *rootContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// startContext is the context created with the document
[rootContext setPersistentStoreCoordinator:[startContext persistentStoreCoordinator]];
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
// set root as parent
[childContext setParentContext:rootContext];
// set undo
[childContext setUndoManager:[startContext undoManager]];
我这样做的原因是因为我遇到了与此处描述的类似问题: 立即启用文档 NSManagedObjectContext 的保存?
所以我提出这个是因为这是我的应用程序中唯一一个我什至接触到 NSUndoManager 的代码。我通过简单地插入 NSManagedObjects 然后撤消插入来测试我的应用程序。有时在两次撤消,或者五次,甚至十次撤消之后,我会收到以下错误:
_endUndoGroupRemovingIfEmpty:: NSUndoManager 0x100159f30 is in invalid state, endUndoGrouping called with no matching begin
2013-01-29 21:31:23.375 TestApplication[30125:303] (
0 CoreFoundation 0x00007fff8a54f0a6 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff8215f3f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff8a54ee7c +[NSException raise:format:] + 204
3 Foundation 0x00007fff80ea021f -[NSUndoManager _endUndoGroupRemovingIfEmpty:] + 195
4 Foundation 0x00007fff80ea0154 -[NSUndoManager endUndoGrouping] + 42
5 Foundation 0x00007fff80ed79da +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 447
6 AppKit 0x00007fff8253632d -[NSApplication run] + 687
7 AppKit 0x00007fff824dacb6 NSApplicationMain + 869
8 TestApplication 0x0000000100001512 main + 34
9 TestApplication 0x00000001000014e4 start + 52
因此,如果我正确地读取了调试信息,那么我需要调用[[context undoManager] beginUndoGrouping]
,但问题是我的程序中没有任何地方使用“[[context undoManager] endUndoGrouping]”。有没有人经历过这个?
任何帮助表示赞赏。