Основные данные: есть ли способ правильно изменить постоянное хранилище во время выполнения?

У меня проблема при попытке изменить постоянное хранилище во время выполнения. Я пытаюсь сделать это, выполняя повторную инициализацию всего стека основных данных:

- (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 в очереди операций)?


person twin    schedule 06.03.2014    source источник
comment
stackoverflow.com/questions/1550658/   -  person user523234    schedule 06.03.2014
comment
Спасибо за ссылку, но я думаю, что это не решает мой случай. Прежде всего, у меня нет доступа к частной очереди, связанной с backgroundContext. Если вы предлагаете мне добавить пустой блок с помощью PerformBlock в фоновом контексте, который представляет последний блок в очереди (allTasksDone), могут быть другие потоки, которые могут добавлять блоки в очередь в последний раз.   -  person twin    schedule 06.03.2014