Как мы можем предотвратить «CoreData не может выполнить ошибку»? - PullRequest
6 голосов
/ 07 августа 2011

Время от времени мы получаем сообщение «CoreData не может выполнить ошибку».Мы прочитали документацию Apple, но неясно, что можно оставить.Мы очень внимательно относились к созданию одного контекста для каждого потока и т. Д. Однако одно из приложений, которое делает наше приложение, - это сохранение NSManagedObjects в наших UIViewControllers (обычно через NSArray или NSDictionary).Я предполагаю, что происходит, когда объектные отношения меняются, и мы не обрабатываем соответствующее уведомление.

Есть ли у кого-нибудь предложения по улучшению дизайна в отношении базовых данных?Когда мы получаем ошибку, я не вижу, что мы фактически удалили что-либо из контекста, чтобы вызвать ошибку.Нужно ли обрабатывать NSManagedObjectContextObjectsDidChangeNotification на наших UIViewControllers, если они сохраняют состояние?Мы ценим любые предложения.

1 Ответ

5 голосов
/ 10 августа 2011

Вы можете зарегистрироваться для уведомлений об изменениях в Базовых данных.Это позволит вам обновлять управляемые объекты при их изменении.Для получения дополнительной информации смотрите Документацию по основным данным.Вас заинтересуют 2 метода регистрации и ответа на изменения:

  [NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(mergeChanges:)
                                              name:NSManagedObjectContextDidSaveNotification
                                            object:(your NSManagedObjectContext)];

Селектор mergeChanges (ваш метод) вызовет следующий метод для синхронизации любых изменений из других потоков.Это будет выглядеть примерно так:

- (void)mergeChanges:(NSNotification *)notification{
  AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
  NSManagedObjectContext *context = [appDelegate managedObjectContext];

  // Merge changes into the default context on the main thread
  [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                            withObject:notification
                         waitUntilDone:YES];  
}
...