Как восстановить содержимое 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, так что некоторые из них сохраняются при завершении работы, в то время как другие откатывают свои изменения. Это не идеально, но я нашел подходящее решение моей проблемы с этой альтернативой.

Другие вопросы по тегам