Как восстановить содержимое NSUndoManager в CoreData NSManagedObjectContext?
Я хотел бы использовать NSUndoManager в приложении iPhone для объектов CoreData (NSManagedObject), чтобы я мог сохранить (и позже восстановить) состояние NSUndoManager, если приложение преждевременно завершает работу (например, из-за входящего телефонного звонка). Т.е. в отличие от автоматической отмены или сохранения изменений, накопленных в NSUndoManager, я хотел бы восстановить их так, чтобы у пользователя была возможность явной отмены или сохранения их при перезапуске приложения.
Кто-нибудь имел опыт работы с этим? Может ли кто-нибудь порекомендовать этот (или альтернативный) подход к управлению ожидающими изменениями в NSManagedObjectContext, когда приложение прерывается?
2 ответа
NSUndoManager
на самом деле не хранит состояние, он хранит стек действий, которые будут восстанавливать состояние. Например, если у вас есть объект XXX, и у него есть имя свойства, которое является строкой, и вы меняете это имя с "Стив" на "Джо", то, что NSUndoManager хранит, является целью, селектором и объектом. Цель будет экземпляром XXX, селектор будет @selector(setName:)
и объект будет @"Steve"
,
Сохраняя эту информацию, если стек отмены извлечен, он вызовет -setName:
на экземпляре объекта XXX со значением @"Steve" и, таким образом, восстанавливаем его состояние. Есть некоторая дополнительная работа, связанная с КВО и т. Д., Но это основа.
Сначала я предположил, что вы могли бы выписать NSManagedObjectID
Селектор (используя NSStringFromSelector
) и объект на диск и восстановить их, вызвав -registerUndoWithTarget: selector: object:
, Однако после дальнейшего просмотра документации, нет никакого способа получить доступ к стеку, чтобы иметь возможность перебирать его.
Обратите внимание, что существует один возможный обходной путь с использованием отдельных NSManagedObjectContexts, так что некоторые из них сохраняются при завершении работы, в то время как другие откатывают свои изменения. Это не идеально, но я нашел подходящее решение моей проблемы с этой альтернативой.