Проблема потребительских товаров с основными данными - PullRequest
6 голосов
/ 23 мая 2009

У меня есть приложение Core Data. В потоке продюсера я извлекаю данные из веб-службы, сохраняю их в своем объекте и вызываю save. Мой потребительский объект - это контроллер табличного представления, который отображает то же самое. Однако приложение вылетает, и я получаю NSFetchedResultsController Ошибка: ожидается, что найдет объект (entity: FeedEntry; id: 0xf46f40; data:) в разделе (null) для удаления

на консоли. Когда я отлаживаю, все работает нормально. Так что я понял, что это похоже на гонку.

Как решается такая проблема? Каков наилучший способ разработки приложения «производитель-потребитель» с основными данными?

Ответы [ 2 ]

16 голосов
/ 24 мая 2009

Если вы выбираете Leopard или более позднюю версию, Apple упростила задачу.

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

В потоке потребителя добавьте свой контроллер в качестве наблюдателя для NSManagedObjectContextDidSaveNotification. Ваш обратный вызов должен выглядеть примерно так:

- (void) managedObjectContextDidSave:(NSNotification *)notification
{
  NSManagedObjectContext *managedObjectContext = [notification object];
  if(managedObjectContext != self.managedObjectContext)
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}

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

0 голосов
/ 24 мая 2009

Базовые данные, как правило, не являются потокобезопасными. Я предпочел бы выполнить минимальную работу в фоновом потоке и передать данные, необходимые для создания сущностей базовых данных, в основной поток, как только вы получите их из веб-службы. Однако взгляните на этот документ . Есть несколько стратегий использования Core Data в разных потоках, если вам нужно.

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