2009-12-01 3 views
2

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

Установка:

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

Требование:

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

вопросы:

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

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

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

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

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

Пример отсоединение Первый вариант ответа

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

ответ

2

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

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

Как вы считаете, контроллер с NSFectchedResultsController правильно справляется со всеми делами NSFetchedResultsControllerDelegate?

+0

Спасибо, что ответили. Да, я использую уведомления для обновления вида moc в основном потоке. Да, я правильно обрабатываю случаи NSFetchedResultsControllerDelegate. Я добавил пример отключения к вопросу. Пока это кажется лучшим решением: - Используйте 1 мок столько, сколько сможете. - Если вы не можете использовать основной moc, создайте новый * каждый раз *, вам нужно что-то изменить, чтобы избежать сохранения изменений, сделанных иначе. Или смените изменения на этот moc, если сможете. - Любые mocs помимо основного должны объединить изменения в основной. Это то, что вы нашли? – jasongregori

+0

Что-то в этом роде. У меня был основной мок, который использовался NSFetchedResultController. Фоновая активность (упакованная в NSOperations) имела свой собственный moc. Любые изменения, внесенные в эти mocs, были переданы с использованием уведомлений в основной мок и объединены. Таким образом, основной мок был только что прочитан. Этот материал сложный, и потребовалось некоторое время, чтобы все было в порядке. Много проб и ошибок. – lyonanderson

Смежные вопросы