Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSUndoManager, Core Data and selective undo/redo

I'm working on a core data application that has a rather large hierarchy of managed objects similar to a tree.

When a base object is created, it creates a few child objects which in turn create their own child objects and so on. Each of these child objects may gather information using NSURLConnections.

Now, I'd like to support undo/redo with the undoManager in the managedObjectContext. The problem is, if a user creates a base object, then tries to undo that action, the base object is not removed. Instead, one or more of the child objects may be removed. Obviously this type of action is unpredictable and unwanted.

So I tried disabling undo registration by default. I did this by calling disableUndoRegistration: before anything is modified in the managedObjectContext. Then, enabling undo registration before base operations such as creating a base object the again re-disabling registrations afterwords.

Now when i try to undo, I get this error:

undo: NSUndoManager 0x1026428b0 is in invalid state, undo was called with too many nested undo groups

Thoughts?

like image 646
Arlen Anderson Avatar asked Dec 28 '10 21:12

Arlen Anderson


1 Answers

NSUndoManager waits for the next run loop cycle until it registers your changes

// do your stuff

// give the run loop a breath

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
[undoManager disableUndoRegistration];
like image 60
Stefanf Avatar answered Oct 10 '22 08:10

Stefanf