Проблема с сгенерированной xCode логикой кода стека основных данных и примером кода основных данных
Вопрос
В сгенерированном коде для основного стека данных в методе applicationWillTerminate вызывается сохранение на managedObjectContext. Это должно позаботиться обо всех несохраненных объектах в контексте перед выходом.
У этого есть нежелательный побочный эффект сохранения любых временных объектов. (Эта проблема видна и в примерах кода Apple. Если вы нажмете «+», чтобы добавить новый «Рецепт» в примере кода «Рецепт», а затем нажмите кнопку «Домой», чтобы закрыть приложение, то наполовину готовый объект «Рецепт» будет отображен при следующем запуске приложения). ). р>
Какой шаблон проектирования предпочтителен для решения этой проблемы? Я мог бы подумать о следующем.
<Ол>Дайте мне знать, если есть лучший способ справиться с этим.
Решение
Решение 1 не влечет за собой копирование объектов. Шаблон иллюстрируется в CoreDataBooks . Вы можете создавать новые объекты во втором контексте, а затем вносить их в основной контекст напрямую (используя objectWithID :) или (как показано и объяснено в примере), наблюдая за NSManagedObjectContextObjectsDidChangeNotification и сливая изменения в основной контекст.
Другие советы
Решение 1 влечет за собой полное копирование объектов. Однако копировать объект сложно. Свойства могут быть обработаны легко, но отношения являются тонкими. Чтобы скопировать отношения (глубокое копирование, а не мелкое), вам нужна рекурсивная процедура, в которой вы всегда заботитесь о том, чтобы не копировать один и тот же объект снова и снова, если когда-либо встретитесь снова на этапе рекурсии.
Решение 2 может быть легче реализовать в зависимости от логики вашего приложения и, как вы заметили, графического интерфейса.
Существует третья возможность правильно обрабатывать временные объекты следующим образом. Добавьте логическое свойство к объекту, связанному с вашими объектами, которое отслеживает статус объекта (временный или нет). Затем с помощью методов NSManagedObjectContext
- (NSSet *)insertedObjects
вы просто перечисляете набор объектов и, в зависимости от значения логического флага, сохраняете или удаляете объект.
Обратите внимание, что это может быть довольно дорого в зависимости от количества объектов.