[NSOperation cancelAllOperations]; не останавливает работу

xCode 4.4.1 OSX 10.8.2, выглядит как [операция cancelAllOperations]; не работает

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSOperationQueue *operation = [[NSOperationQueue alloc] init];
    [operation setMaxConcurrentOperationCount: 1];
    [operation addOperationWithBlock: ^{
        for (unsigned i=0; i < 10000000; i++) {
            printf("%i\n",i);
           }
    }];
    sleep(1);
    if ([operation operationCount] > 0) {
        [operation cancelAllOperations];
    }
}

Результаты 9999999

Ответы

Ответ 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.