У меня проблема при попытке изменить постоянное хранилище во время выполнения. Я пытаюсь сделать это, выполняя повторную инициализацию всего стека основных данных:
- (void)initializeCoreDataForStore:(NSUrl *)storeURL withCompletionBlock:(CoreDataRWCompletionBlock)completionBlock
{
//this code is needed to reset core data stack before re-creating the new one
[_managedObjectContextBackgroundQueue reset];
_managedObjectContextBackgroundQueue = nil;
[_managedObjectContextMainQueue reset];
_managedObjectContextMainQueue = nil;
_managedObjectModel = nil;
_persistentStoreCoordinator = nil;
_persitentStore = nil;
//---------------end reset core data stack ---------------------
//model
self.managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
//main context
self.managedObjectContextMainQueue = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[self.managedObjectContextMainQueue setPersistentStoreCoordinator:self.persistentStoreCoordinator];
//background context
self.managedObjectContextBackgroundQueue = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[self.managedObjectContextBackgroundQueue performBlockAndWait:^{
[self.managedObjectContextBackgroundQueue setPersistentStoreCoordinator:self.persistentStoreCoordinator];
}];
dispatch_queue_t queue = NULL;
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSError *error = nil;
self.persitentStore = [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
dispatch_sync(dispatch_get_main_queue(), ^{
if (completionBlock) {
completionBlock([error localizedDescription], nil);
}
});
});
}
Вся работа с фоновым контекстом выполняется с помощью PerformBlock или PerformBlockAndWait. Проблема в том, что, если я перезагружаю и повторно инициализирую стек, если есть ожидающие «операции» в старом фоновом контексте, эти операции не отменяются, и они продолжают выполняться, более того, они пытаются выполнить с помощью вновь созданный фоновый контекст, который имеет другое постоянное хранилище. Есть ли способ отменить все операции из частной очереди, связанной с фоновым контекстом (способ отмены nsoperations в очереди операций)?