2014-01-27 2 views
2

Я использую шаблон параллелизма parent/child для импорта больших блоков данных. Импорт выполняется в фоновом режиме, не блокируя основной поток, как это:Отмена NSManagedObjectContext performBlock

NSManagedObjectContext *temporaryContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
temporaryContext.parentContext = mainMOC; 

[temporaryContext performBlock:^{ 
    // import data … 

    // push to parent 
    NSError *error; 
    if (![temporaryContext save:&error]) { 
     // handle error 
    } 

    // save parent to disk asynchronously 
    [mainMOC performBlock:^{ 
     NSError *error; 
     if (![mainMOC save:&error]) { 
     // handle error 
     } 
    }]; 
}]; 

Все прекрасно работает, но что, если мне нужно отменить импорт данных? Есть ли способ отменить executeBlock?

ответ

1

Нет - блоки и любая другая синхронная операция не могут быть неявно отменены.

вы должны запрограммировать его, чтобы быть сократимым

например здесь, может быть, ... расколоть performBLock на N вызовов. Каждый из них мало работает.

0

Если у кого-то еще такая же проблема, моим решением было использовать два независимых контекста управляемых объектов, которые оба связаны с одним и тем же постоянным координатором хранилища. Контекст управляемых объектов, который выполняет тяжелую работу, инкапсулируется в подкласс NSOperation. NSOperation можно отменить в любой момент. Вот пример link на примере Apple.

+0

извините - это неправильная створка ... nsoperation, после запуска не может быть отменена, если она не реализована, чтобы отменить себя. NSOperations имеет метод отмены, но только устанавливает состояние операции. Он должен быть запрограммирован для проверки состояния –

+0

yep, прежде чем я сохраню контекст фона, я проверяю, была ли операция отменена. Если он был отменен, я не сохраняю контекст. – sash

Смежные вопросы