В настоящее время [май 2015 г.] Apple Concurrency with Core Data documentation в лучшем случае очень вводит в заблуждение, поскольку он не охватывает какие-либо улучшения в iOS 5 и, следовательно, больше не показывает наилучшие способы одновременного использования данных ядра.Есть два очень важных изменения в iOS 5 - родительские контексты и новые типы параллелизма/потоков.
Я еще не нашел письменной документации, которая всесторонне охватывает эти новые функции, но WWDC 2012 video "Session 214 - Core Data Best Practices" все это очень хорошо объясняет.
Magical Record использует эти новые функции и может стоить того.
Настоящие основы все те же: вы все же можете использовать только управляемые объекты, в которые был создан поток, на котором был создан контекст управляемого объекта.
Теперь вы можете использовать [moc executeBlock:] для запуска кода в правой нити.
Нет необходимости использовать mergeChangesFromContextDidSaveNotification: больше; вместо этого создайте дочерний контекст для внесения изменений, а затем сохраните дочерний контекст. Сохранение дочернего контекста автоматически введет изменения в родительский контекст, а для сохранения изменений на диске просто выполните сохранение в родительском контексте в потоке.
Для этой работы необходимо создать родительский контекст с одновременным типом, например:
mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
Затем на фоне резьбе:
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[context setParentContext:mainManagedObjectContext];
<... perform actions on context ...>
NSError *error;
if (![context save:&error])
{
<... handle error ...>
}
[mainManagedObjectContext performBlock:^{
NSError *e = nil;
if (![mainContext save:&e])
{
<... handle error ...>
}
}];
Я нашел отличный пример объединения контекстов в CoreDataBooks (mergeChangesFromContextDidSaveNotification). спасибо. Имейте славный день. Paolo aka SlowTree – SlowTree
О, слава богу. Я читаю это, решил свои проблемы. Импортировал большой набор данных в фоновый поток и получал множество непредсказуемых исключений. Создавать контекст в фоновом потоке, а не передавать его, хотя, похоже, исправили мои иссы. – tobyc
Этот документ еще не обновлен, чтобы воспользоваться очень важными улучшениями в iOS 5 - видео, на которое я ссылаюсь в своем ответе, теперь является лучшей ссылкой. – JosephH