Я использую
-com.apple.CoreData.ConcurrencyDebug
для запуска отладки concurrency в моем приложении CoreData.
Во время запуска приложения я выполняю асинхронную выборку в контексте объекта с управляемым потоком.
// set up the async request
NSError * error = nil;
[MOC executeRequest:asyncFetch error:&error];
if (error) {
NSLog(@"Unable to execute fetch request.");
NSLog(@"%@, %@", error, error.localizedDescription);
}
Этот код вызывается из основного потока, но executeRequest:
помещает его в другой поток, который, как я понимаю, является правильным поведением.
Отладчик concurrency не нравится, говоря (я считаю), что я делаю что-то неправильно здесь. Я также попытался обернуть это в [MOC performBlock:]
, который также работает, но также вызывает нарушение многопоточности. В обоих случаях я получаю следующее:
[NSManagedObjectContext __Multithreading_Violation_AllThatIsLeftToUsIsHonor__
Я неправильно использую асинхронные выборки или отладчик concurrency здесь неправильно?
EDIT: Я также попробовал обернуть его в MOC performBlock
, который должен обеспечить, чтобы он вызывался из основного потока. В любом случае вызов помещается в очередь из основного потока, но выполняется в другом месте.
EDIT: здесь запрос на выборку:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
NSPredicate * pred = [NSPredicate predicateWithFormat:@"boolProperty == YES"];
fetchRequest.predicate = pred;
NSSortDescriptor * sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
fetchRequest.sortDescriptors = @[sort]; fetchRequest.propertiesToFetch = @[@"prop1", @"prop2", @"prop3", @"prop4"];
NSPersistentStoreAsynchronousFetchResultCompletionBlock resultBlock = ^(NSAsynchronousFetchResult *result) {
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kFetchCompleteNotification object:result];
});
};
NSAsynchronousFetchRequest *asyncFetch = [[NSAsynchronousFetchRequest alloc]
initWithFetchRequest:fetchRequest
completionBlock:resultBlock];
Затем я получаю результаты извещения:
- (void)fetchCompletedNote:(NSNotification *)note {
NSAsynchronousFetchResult * result = note.object;
if (![cachedResults isEqualToArray:result.finalResult]){
cacheResults = result.finalResult;
[self.collectionView reloadData];
}
}