Проблема с сгенерированной xCode логикой кода стека основных данных и образцом кода основных данных - PullRequest
0 голосов
/ 11 сентября 2009

В сгенерированном коде для основного стека данных в методе applicationWillTerminate вызывается сохранение файла managedObjectContext. Это должно позаботиться обо всех несохраненных объектах в контексте перед выходом.

Это имеет нежелательный побочный эффект сохранения любых временных объектов. (Эта проблема видна и в примерах кода Apple. Если вы нажмете «+», чтобы добавить новый «Рецепт» в примере кода «Рецепт», а затем нажмите кнопку «Домой», чтобы закрыть приложение, то наполовину готовый объект «Рецепт» станет видимым при следующем запуске приложения ).

Какой шаблон проектирования предпочтителен для решения этой проблемы? Я мог бы подумать о следующем.

  1. Используйте другой блокнот управляемыйObjectContext для временных объектов, а когда вы решите действительно сохранить, затем нажмите копию в главном управляемом объекте. Вызовите сохранение только для основного управляемого объекта объекта в applicationWillTerminate. (Есть ли простой и быстрый способ переместить объект из одного managedObjectContext в другой, кроме создания копии вручную в новом контексте?)
  2. Удалите сохранение из applicationWillTerminate, но убедитесь, что все объекты сохранены сразу после внесения изменений. (Это может быть непросто все время, у меня есть приложение с вкладками, пользователь мог одновременно инициировать операции редактирования).

Дайте мне знать, если есть лучший способ справиться с этим.

Ответы [ 2 ]

0 голосов
/ 14 января 2010

Решение 1 не влечет за собой копирование объектов. Шаблон иллюстрируется на примере CoreDataBooks . Вы можете создавать новые объекты во втором контексте, а затем вносить их в основной контекст напрямую (используя objectWithID :) или (как показано и объяснено в примере), наблюдая за NSManagedObjectContextObjectsDidChangeNotification и объединяя изменения в ваш основной контекст.

0 голосов
/ 11 сентября 2009

Решение 1 влечет за собой полное копирование объектов. Однако копировать объект сложно. Свойства могут быть обработаны легко, но отношения являются тонкими. Чтобы скопировать отношения (глубокая, а не мелкая), вам нужна рекурсивная процедура, в которой вы всегда заботитесь о том, чтобы не копировать один и тот же объект снова и снова, если когда-либо встретитесь снова на этапе рекурсии.

Решение 2 может быть легче реализовать в зависимости от логики вашего приложения и, как вы отметили, GUI.

Существует третья возможность правильно обрабатывать временные объекты следующим образом. Добавьте логическое свойство к объекту, связанному с вашими объектами, которое отслеживает статус объекта (временный или нет). Затем, используя методы NSManagedObjectContext

- (NSSet *)insertedObjects

вы просто перечисляете набор объектов и, в зависимости от значения логического флага, сохраняете или удаляете объект.

Обратите внимание, что это может быть довольно дорого в зависимости от количества объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...