2013-02-22 3 views
6

В моем приложении у меня есть UITableViewController, который показывает список событий. Этот контроллер использует ManagedObjectContext Say ParentContext. Теперь, если выбрано какое-либо событие, отображается подробный контроллер просмотра, где пользователи могут редактировать детали события. Таким образом, я создал контекст ребенка сказать,Основные данные Многоуровневый родительский - Детский контекст

ChildContext with type "NSPrivateQueueConcurrencyType"

ChildContext whose parent Context is "ParentContext".

Мой код:

NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    childContext.parentContext = self.context ; 

Теперь снова есть некоторые поля и отношения, которые необходим другой бур вниз. Таким образом, я создал еще один ChildContext для нового контроллера представления говорят,

GrandChildContext with type "NSPrivateQueueConcurrencyType"

GrandChildContext whose parent context is "ChildContext"

этот процесс идет на другом уровне (всего 4 уровня от родительского (Tableview) к ребенку)

self.context - Parent Context 
    | 
    | 
ChildContext 
    | 
    | 
GrandChildContext 
    | 
    | 
GrandGrandChildContext 

Моя сущность выглядит следующим образом

EntityA   -- (Edit View Controller - uses ChildContext) 
| 
|- Field1 
| 
|- Field2 
| 
|- RelationShip (1 to Many) - (Relationship Add/Edit View Controller - uses GrandChildContext) 
    | 
    |- Field1 
    | . 
    | . 
    |- Field3 
    | 
    |- Relationship (1 to Many) - (Relationship Add/Edit View Controller - uses GrandGrandChildContext) 
      | 
      |- Field1 
      | 
      |- Field2 

Это правильный способ использования родительского - детского контекста? Потому что в один момент времени у меня будет 1 NSMainQueueConcurrencyType MOC and 3 NSPrivateQueueConcurrencyType MOC.

Если это не так? Есть ли другой путь?

Слишком много детского контекста влияет на производительность приложений?

Первоначально я использовал свойства и NSArrays для управления введенными пользователем данными, и когда пользователь нажимает кнопку «Сделано», я буду обновлять/создавать управляемые объекты. Но это утомительная работа, из-за которой мой диспетчер просмотра грязный. Поэтому я переключился на контекст родителя-ребенка, который очень легко сохранить или выбросить обновления.

Благодаря

ответ

4

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

Мне нравится ваш подход, имеющий отдельную ссылку в пределах каждого контроллера/сцены представления к MOC, который применяется к этой сцене.

Иногда полезно подумать о MOC как сеансе или блокноте. Совпадение не происходит между MOC и Entities, а скорее между MOC и логическими единицами работы.

Если один из ваших сокращений отмечает начало некоторой задачи редактирования, которую пользователь может захотеть отказаться или отменить, это хороший момент, чтобы открутить дочерний MOC и передать его новому виду. Вы можете, при необходимости, откат: или даже просто отказаться от MOC, когда вы снова вернетесь к исходной точке.

С другой стороны, если вы просто писали статическую информацию, используйте только один MOC. В этом случае нет необходимости использовать или использовать больше.

+3

Во всех сверлениях у меня есть задача редактирования. Мне удалось немного сократить операцию сохранения/отмены в некоторых деталях. После работы с этой моделью в течение некоторого времени единственная проблема, которую я обнаружил, заключается в том, что созданные отношения не видны в родительском ребенке. Это происходит только в ios 5, это известная ошибка, и я исправил ее, вызвав getPermanentID непосредственно перед тем, как сохранить дочерние контексты. – krishnan

+0

О, мой бог, + кришнан, я порвал свои волосы наполовину, прежде чем нашел этот комментарий, и попытался добавить вызов getPermanentIDs. –

-1

Возможно, есть небольшое количество путаницы о лучшем случае использования для вложенных управляемых контекстов объектов. Для вашего случая я бы рекомендовал использовать только один контекст.

Перемещение на основные данные из массивов и т. Д. Было очень хорошей идеей. Теперь развяжите истинную мощность и простоту графического объекта. Старайтесь держать вещи простыми.

Чтобы развернуть, просто передайте контекст контроллеру дочернего представления. Контроллеры дочерних представлений, получающие результаты, могут использовать тот же контекст, что и родительский контроллер представления. Многочисленные примеры кода Apple используют именно этот шаблон.

Единственный раз, когда вам нужны контексты, если вам действительно нужна параллелизм. Это вообще не так. Новый интерфейс контроллера дочернего представления отображается после получения данных. Если это происходит слишком долго (скажем, потому что данные поступают из веб-службы), вы показываете какой-то интерфейс «Подождите» и покажите полный интерфейс после завершения поиска данных. Скорее всего, это не ваш сценарий.

+5

Если вы посмотрите на [link] (https://developer.apple.com/videos/wwdc/2012/) wwdc 2012 год, посвященный передовой практике в отношении данных 214, он показывает, как использовать родительский и дочерний контекст для отображения деталей просмотрите контроллер. Я использую ту же технику, так что если пользователь нажимает кнопку сохранения, я могу сохранить дочерний контекст, и все изменения дочернего контекста будут перенесены в родительский контекст. И когда пользователь нажимает кнопку отмены, я просто отклоняю контроллер вида, и все изменения будут потеряны. Здесь все контроллеры моего дочернего представления - это инспектор деталей, в котором используются данные редактирования, поэтому нет выбранного контроллера результатов. – krishnan

+0

Вы можете добиться того же, что и в одном контексте, используя '[context rollback];' вместо '[context save: nil];'. Видео WWDC полезна, если выборка для контроллера подробного представления займет слишком много времени. – Mundi

+0

Я думаю, вы не понимаете мой вопрос. Мои вопросы похожи на этот [один] (http://stackoverflow.com/questions/10443754/undo-all-changes-made-in-the-child-view-controller). Но в моем случае у меня есть многоуровневый детский контекст. С '[откатом контекста]' все мои изменения будут потеряны. Но вместо этого я хочу, чтобы только некоторые изменения были отброшены. В ближайшее время я выложу примерный проект. спасибо – krishnan