[的NSOperation cancelAllOperations]; 不停止操作([NSOpe

2019-08-01 01:14发布

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

Answer 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];
}

队列不能只停留在操作的执行任意 - 如果某些共享资源正由从来没有得到清理的操作是什么? 这是你的责任,有序到底什么时候变成已知取消了操作。 从苹果的文档 :

的操作对象是负责周期性地调用isCancelled和停止本身如果该方法返回YES。



文章来源: [NSOperation cancelAllOperations]; does not stop the operation