Этот тип параллелизма по умолчанию для NSManagedObjectContext
равен NSConfinementConcurrencyType
, что означает, что он может использоваться только одним потоком. Из документации:
Вы обещаете, что контекст не будет использоваться никаким потоком, кроме
тот, на котором вы его создали.
Вместо этого можно создать контекст управляемого объекта, который поддерживается частной очередью для многопоточного использования:
[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]
Чтобы использовать контекст управляемого объекта из другого потока, используйте performBlock:
(асинхронный) или performBlockAndWait:
(синхронный), например,
__block NSArray *results;
[[self managedObjectContext] performBlockAndWait:^{
results = [[self managedObjectContext] executeFetchRequest:request error:&error];
}];
// do something with results
В документации сказано, что вам не нужно использовать блочный API из потока, который создал контекст управляемого объекта.
Другим вариантом является создание отдельных контекстов управляемого объекта для каждого потока.
См. Примечания к выпуску iOS 5 для получения дополнительной информации.