У меня возникают проблемы с Core Data, которые я не могу решить. Я узнал о проблемах concurrency в Core Data сложным образом, поэтому я очень осторожен и выполняю только операции с основными данными в блоках performBlock:
и performBlockAndWait:
.
Вот мой код:
/// Executes a fetch request with given parameters in context block.
+ (NSArray *)executeFetchRequestWithEntityName:(NSString *)entityName
predicate:(NSPredicate *)predicate
fetchLimit:(NSUInteger)fetchLimit
sortDescriptor:(NSSortDescriptor *)sortDescriptor
inContext:(NSManagedObjectContext *)context{
NSCAssert(entityName.length > 0,
@"entityName parameter in executeFetchRequestWithEntityName:predicate:fetchLimit:sortDescriptor:inContext:\
is invalid");
__block NSArray * results = nil;
NSPredicate * newPredicate = [CWFCoreDataUtilities currentUserPredicateInContext:context];
if (predicate){
newPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[newPredicate, predicate]];
}
[context performBlockAndWait:^{
NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:entityName];
request.fetchLimit = fetchLimit;
request.predicate = newPredicate;
if (sortDescriptor) {
request.sortDescriptors = @[sortDescriptor];
}
NSError * error = nil;
results = [context executeFetchRequest:request error:&error];
if (error){
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:@"Fetch requests are required to succeed."
userInfo:@{@"error":error}];
NSLog(@"ERROR! %@", error);
}
NSCAssert(results != nil, @"Fetch requests must succeed");
}];
return results;
}
Когда я ввожу этот метод одновременно из двух разных потоков и передаю два разных контекста, я получаю тупик в этой строке: results = [context executeFetchRequest:request error:&error];
Что интересно: кажется, что оба потока не могут получить некоторую блокировку в Координаторе постоянных хранилищ, чтобы выполнить запрос на выборку.
Все мои контексты NSPrivateQueueConcurrencyType
.
Я не могу сказать, почему я блокирую приложение и что мне делать по-другому. Мои исследования Qaru ничего мне не дали, поскольку большинство людей фиксировали все блокировки, отправляя запросы на выборку в очередь MOC, что я уже делаю.
Буду признателен за любую информацию по этому вопросу. Не стесняйтесь предоставлять ссылки для документации и другие длительные чтения: я очень хочу узнать больше о всех типах проблем и стратегий concurrency.