В настоящее время [май 2015 г.] документация Apple Concurrency с Core Data , в лучшем случае, очень вводит в заблуждение, поскольку она не охватывает какие-либо улучшения в iOS 5 и, следовательно, больше не показывает лучшие способы использовать основные данные одновременно. В iOS 5 есть два очень важных изменения - родительский контекст и новые типы параллелизма / потоков.
Я еще не нашел ни одной письменной документации, которая бы всесторонне охватывала эти новые функции, но видео WWDC 2012 "Сессия 214 - Рекомендации по основным данным" действительно объясняет все это очень хорошо.
Волшебная запись использует эти новые функции и, возможно, стоит посмотреть.
Реальные основы остаются прежними - вы все еще можете использовать только те управляемые объекты, для которых создан контекст управляемого объекта.
Теперь вы можете использовать [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 ...>
}
}];