Проблема с сгенерированной xCode логикой кода стека основных данных и примером кода основных данных

StackOverflow https://stackoverflow.com/questions/1408493

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

    Это было полезно?

    Решение

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

    Другие советы

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

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

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

    - (NSSet *)insertedObjects
    

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top