15

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

4

1 回答 1

30

在你的块内,特别是在循环内,调用-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 时自行停止。

于 2012-09-30T11:04:56.997 回答