NSUndoManager, Core Data и выборочная отмена / повтор - PullRequest
7 голосов
/ 29 декабря 2010

Я работаю над основным приложением данных, которое имеет довольно большую иерархию управляемых объектов, похожих на дерево.

Когда создается базовый объект, он создает несколько дочерних объектов, которые, в свою очередь, создают свои собственные дочерние объекты и так далее. Каждый из этих дочерних объектов может собирать информацию, используя NSURLConnections.

Теперь я хотел бы поддержать отмену / повтор с помощью undoManager в managedObjectContext. Проблема в том, что если пользователь создает базовый объект, а затем пытается отменить это действие, базовый объект не удаляется. Вместо этого один или несколько дочерних объектов могут быть удалены. Очевидно, что этот тип действий непредсказуем и нежелателен.

Поэтому я попытался отключить регистрацию отмены по умолчанию. Я сделал это, вызвав disableUndoRegistration: до того, как что-либо изменилось в managedObjectContext. Затем, включение регистрации отмены перед базовыми операциями, такими как создание базового объекта, повторное отключение регистрации после слов.

Теперь, когда я пытаюсь отменить, я получаю эту ошибку:

отмена: NSUndoManager 0x1026428b0 находится в недопустимое состояние, отмена была вызвана с слишком много вложенных групп отмены

Мысли

Ответы [ 3 ]

6 голосов
/ 29 января 2011

NSUndoManager ожидает следующего цикла цикла выполнения, пока не зарегистрирует ваши изменения

// do your stuff

// give the run loop a breath

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
[undoManager disableUndoRegistration];
5 голосов
/ 06 января 2012

Более года с тех пор, как этот вопрос был опубликован, но в любом случае вот ответ:

Вы должны проверить документацию Apple, в которой говорится:

.. Сообщение об отменезакрывает последнюю открытую группу отмены и затем применяет все операции отмены в этой группе ... Если какие-либо закрытые вложенные группы отмены находятся в стеке при вызове отмены, это вызывает исключение.Чтобы отменить вложенные группы, вы должны явно закрыть группу сообщением endUndoGrouping, а затем использовать undoNestedGroup, чтобы отменить ее.

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/UndoArchitecture/Articles/PerformingUndo.html

0 голосов
/ 28 декабря 2012

Мое пересечение с NSUndoManager is in invalid state, undo was called with too many nested undo groups не связано с CoreData, однако мой ответ может быть полезен тем не менее.

В моем случае это исключение менеджера отмены возникло из-за необработанного исключения в моем коде, которое было поднятово время звонка в NSUndoManager -undo.

Оглядываясь через консоль, я мог видеть как исключение кода моего приложения, так и исключение NSInternalInconsistencyException менеджера отмены.

Я использовал поведение группы отмены запуска по умолчанию и не группировал явно свои регистрации отмены.

...