Как правильно использовать NSManagedObjectContexts при редактировании / создании новых объектов (iPhone)? - PullRequest
2 голосов
/ 01 декабря 2009

Я пытаюсь выяснить, как правильно использовать NSManagedObjectContexts при просмотре, редактировании и создании NSManagedObjects. Я чувствую, что документация и примеры объяснили, как использовать их в самых основных случаях, но я не уверен, что правильные методы в немного более сложной установке.

Настройка:

  • 3 основных экрана: список объектов, экран редактирования объекта и экран нового объекта.
  • Другой поток загружает объекты для добавления в список в фоновом режиме.

Требования:

  • Экран списка использует MOC и NSFetchedResultsController, чтобы получить все его объекты.
  • Экраны редактирования и новых объектов используют MOC для сохранения / удаления объектов И используют NSFetchedResultsControllers для отношений.
  • Загруженным объектам требуется MOC для сохранения своих объектов в Core Data (в главном потоке).

Вопросы:

  • Сколько МОК мне нужно?
  • Как мне манипулировать этими MOC?

Возможные ответы:

  • Имейте один "Просмотр" MOC, который никогда не редактируется и используется на экране списка. Используйте отдельные MOC для редактирования, экранов новых объектов и загрузок. Когда эти MOC сохранятся, объедините изменения обратно в «Просмотр» MOC. Таким образом, любые изменения не влияют на «просмотр» MOC, пока они не будут сохранены. Это то, что я делал; Кажется, все работает не так гладко, как я надеялся. Существует разрыв между редактированием и просмотром, и вместо того, чтобы проверять вещи, когда я знаю, что они могут измениться, я должен дождаться завершения методов делегата NSFetchedResultsController и проверить все возможные вещи, которые могли измениться. Это также затрудняет, если мне нужно изменить некоторые данные в виде списка.

  • Есть один MOC для всего. Это то, что я впервые попробовал, но не знал, как справиться с редактированием и созданием. Теперь, когда я понимаю немного больше, я думаю, я мог бы просто отредактировать объект или создать объект и rollBack при отмене. На cimgf я увидел запись , которая выглядела аналогично, в которой говорилось о создании отмены группировки вокруг редактирования / создания и undo при отмене. Тогда, я думаю, я мог бы использовать отдельный MOC на загруженных объектах, потому что он может закончить и сохранить, пока пользователь редактирует в основном MOC.

  • В любом случае, дело в том, что я не знаю, каков правильный метод. Вы можете мне помочь?

Пример отключения при первом возможном ответе

  1. Создан объект (1) в редакторе moc. Сохраненный. Объединено с view moc по уведомлению.
  2. Создан новый moc, потому что я загружаю объекты в фоновом режиме. Обновлены некоторые объекты, связанные с (1). Сохраненный. Объединено с view moc по уведомлению.
  3. Редактировать (1) в редактировать МОК. Сохраненный. Объединено с view moc по уведомлению.
  4. ПРОБЛЕМА: Поскольку редактирующий мук никогда не получал новые изменения мотива, при сохранении он удаляет все новые изменения мотива, затронутые им.
  5. РЕШЕНИЕ: я понимаю, что я мог бы также объединить изменения в редакторе или всегда использовать новый редактор для редактирования. Тем не менее, я продолжаю сталкиваться с такими мелочами и искать решения, поэтому мне остается верить, что это не лучший ответ.

1 Ответ

2 голосов
/ 08 декабря 2009

У вас должен быть хотя бы один MOC на поток (они не являются потокобезопасными). Таким образом, вы можете иметь MOC для загрузчика (в фоновом потоке) и другое для активности в основном списке потоков, редактировать и создавать новые.

Когда вы говорите, что есть разъединение, можете ли вы быть более конкретным? Используете ли вы уведомления (NSManagedObjectContextDidSaveNotification) и делаете ли mergeChangesFromContextDidSaveNotification при получении этого уведомления. Помните, что mergeChangesFromContextDidSaveNotification должно выполняться в основном потоке.

В вашем контроллере вида с NSFectchedResultsController вы правильно обрабатываете все случаи NSFetchedResultsControllerDelegate?

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