Я пытаюсь выяснить, как использовать 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) в MOC редактирования. Сохраненный. Слияние с видом moc путем уведомления.
- Создал новый moc, потому что я загружаю объекты в фоновом режиме. Обновлены некоторые объекты, связанные с (1). Сохраненный. Слияние с видом moc путем уведомления.
- Редактировать (1) в редакторе moc. Сохраненный. Слияние с видом moc путем уведомления.
- ПРОБЛЕМА: поскольку редактирование moc никогда не получало новые изменения moc, когда оно сохраняется, оно удаляет все новые изменения moc, затронутые им.
- РЕШЕНИЕ: Я понимаю, что я мог бы также объединить изменения в редакторе moc или всегда использовать новый moc для редактирования вещей. Тем не менее, я постоянно сталкиваюсь с такими вещами и должен найти решения, поэтому мне кажется, что это не лучший ответ.
Спасибо, что ответили. Да, я использую уведомления для обновления вида moc в основном потоке. Да, я правильно обрабатываю случаи NSFetchedResultsControllerDelegate. Я добавил пример отключения к вопросу. Пока это кажется лучшим решением: - Используйте 1 мок столько, сколько сможете. - Если вы не можете использовать основной moc, создайте новый * каждый раз *, вам нужно что-то изменить, чтобы избежать сохранения изменений, сделанных иначе. Или смените изменения на этот moc, если сможете. - Любые mocs помимо основного должны объединить изменения в основной. Это то, что вы нашли? – jasongregori
Что-то в этом роде. У меня был основной мок, который использовался NSFetchedResultController. Фоновая активность (упакованная в NSOperations) имела свой собственный moc. Любые изменения, внесенные в эти mocs, были переданы с использованием уведомлений в основной мок и объединены. Таким образом, основной мок был только что прочитан. Этот материал сложный, и потребовалось некоторое время, чтобы все было в порядке. Много проб и ошибок. – lyonanderson