Ответ 1
Внутри вашего блока, особенно внутри цикла, вызовите -isCancelled
в операции. Если это правда, верните.
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount: 1];
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakOperation = operation;
[operation addExecutionBlock: ^ {
for (unsigned i=0; i < 10000000; i++) {
if ([weakOperation isCancelled]) return;
printf("%i\n",i);
}
}];
[operationQueue addOperation:operation];
sleep(1);
if ([operationQueue operationCount] > 0) {
[operationQueue cancelAllOperations];
}
Очередь не может просто остановить выполнение операции произвольно - что, если некоторые общие ресурсы использовались при операции, которая никогда не очищалась? Это ваша ответственность за упорядоченное прекращение операции, когда становится известно, что ее отменят. Из Документы Apple:
Объект операции отвечает за вызов isCancelled периодически и останавливается, если метод возвращает YES.