Какова эффективная стратегия контекста / координатора CoreData для этого общего шаблона приложения? - PullRequest
0 голосов
/ 12 сентября 2010

У меня есть общий шаблон приложения: пользователь вводит данные в контроллер основного представления, а затем просматривает их в таблице в контроллере модального представления, где строки могут быть удалены или изменены. Я следовал общей стратегии дизайна из курса iPhone в Стэнфорде, но где-то все пошло не так, и все, что я получал, это SIGABRT и исключения, такие как «Незаконная попытка установить связь« xyz »между объектами в разных контекстах».

Как и в Стэнфордском курсе, я использую одноэлементный класс «База данных», который должен возвращать тот же контекст всякий раз, когда запрашивается. Итак, первые команды в моем методе viewDidLoad на контроллере основного вида:

 dbsingleton = [Database sharedInstance];
 nmocontext = [dbsingleton managedObjectContext];

nmocontext - это ивар, который я использую в контроллере вида. Когда пользователь хочет увидеть другой контроллер представления вместе с таблицей, я выделяю-инициализирую его, а затем представляю его модально. (У него есть NSFetchedResultsController, который поставляет данные из моего магазина.) Я попробовал различные стратегии здесь:

  • Я сделал NSFetchedResultsController сохраняемым свойством, установленным контроллером основного вида
  • Я сделал NSManagedObjectContext сохраняемым свойством, установленным контроллером основного представления; и
  • Я использовал синглтон для внутреннего использования, повторяя эти две строки кода выше в начале метода viewDidLoad контроллера табличного представления.

Что бы я ни делал, единственная проблема, которую я просто не могу решить, это то, что после того, как пользователь закрывает и освобождает контроллер табличного представления (и его NSFetchedResultsController), я начинаю получать сбои в главном контроллере представления, когда осуществляется доступ к хранилищу ( как ошибка «Незаконная попытка», упомянутая выше).

Каковы лучшие практики для работы с этим общим шаблоном приложения? Я все еще надеюсь сделать это приложение совместимым с iPhone SDK 3.x, но у меня, похоже, меньше сбоев при использовании iOS 4 - если есть проблемы с 3.x, которые вызывают у меня проблемы, пожалуйста, дайте мне знаю, и я могу ориентироваться только на iOS 4.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2010

Похоже, ваш синглтон не настроен должным образом.

Синглтон должен переопределить release, чтобы ничего не делать, чтобы при отправке сообщения о выпуске ничего не происходило. Если вы не переопределите release, то любой случайный фрагмент кода в любом месте приложения может уничтожить синглтон и полностью уничтожить цель использования синглтона. В следующий раз, когда вы вызываете singleton, вы фактически получаете другой новый объект, который в этом случае также возвращает новый контекст управляемого объекта.

См. Руководство по основам какао: создание экземпляра Singleton .

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

0 голосов
/ 12 сентября 2010

Это только предположение, но я предполагаю, что следующая проблема для ваших сбоев после закрытия таблицы:

Вы объявили собственность

@property (retain, nonatomic) NSManagedObjectContext* nmocontext;

Правильно ли вы высвобождаете наноконтекст ivar в dealloc? Если да, то ваша проблема в задании

nmocontext = [dbsingleton managedObjectContext];

Это никогда не сохраняет nmocontext в вашем viewcontroller, но вы отпускаете его на dealloc.

Второе:

«Незаконная попытка установить связь« xyz »между объектами в разных контекстах.»

Это не проблема управления памятью, но вы, вероятно, создали еще один новый контекст для добавления объектов (как в примерах iphone для основных данных Apple) и попытались установить NSManagedObject как отношение из другого контекста.

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