Как восстановить содержимое NSUndoManager в CoreData NSManagedObjectContext?

Я хотел бы использовать NSUndoManager в приложении iPhone для объектов CoreData (NSManagedObject), чтобы я мог сохранять (и позже восстанавливать) состояние NSUndoManager, если приложение преждевременно завершает работу (скажем, из-за входящего телефонного звонка). т.е. в отличие от автоматического удаления или сохранения изменений, накопленных в NSUndoManager, я хотел бы восстановить их, чтобы у пользователя была возможность явно отменить или сохранить их при перезапуске приложения.

У кого-нибудь был опыт с этим? Может ли кто-нибудь порекомендовать этот (или альтернативный) подход к управлению ожидающими изменениями в NSManagedObjectContext, когда приложение прерывается?


person David Carney    schedule 30.12.2009    source источник


Ответы (2)


NSUndoManager на самом деле не хранит состояние, он хранит стек действий, которые восстанавливают состояние. Например, если у вас есть объект XXX и у него есть имя свойства, которое является строкой, и вы меняете это имя со «Стив» на «Джо», то, что хранит NSUndoManager, является целью, селектором и объектом. Целью будет экземпляр XXX, селектором будет @selector(setName:), а объектом будет @"Steve".

Сохранив эту информацию, если стек отмены будет извлечен, он вызовет -setName: для экземпляра объекта XXX со значением @"Steve" и, таким образом, восстановит свое состояние. Есть некоторая дополнительная работа, проделанная вокруг KVO и т. д., но это основы.

Сначала я предположил, что можно записать NSManagedObjectID, селектор (используя NSStringFromSelector) и объект на диск и восстановить их, вызвав -registerUndoWithTarget: selector: object:. Однако при дальнейшем просмотре документации нет никакого способа получить доступ к стеку, чтобы иметь возможность перебирать его.

person Marcus S. Zarra    schedule 02.01.2010
comment
К сожалению, я согласен. Кажется, нет удобного и простого способа сделать это. Конечно, есть обходные пути, но ничего элегантного на ум не приходит. - person David Carney; 15.01.2010

Обратите внимание, что существует один возможный обходной путь с использованием отдельных NSManagedObjectContexts, так что некоторые из них сохраняются при завершении работы, а другие откатываются. Это не идеально, но я нашел подходящее решение своей проблемы с помощью этой альтернативы.

person David Carney    schedule 23.02.2010