[NSOperation cancelAllOperations]; does not stop the operation

后端 未结 1 1258
感动是毒
感动是毒 2021-02-13 06:05

xCode 4.4.1 OSX 10.8.2, looks like [operation cancelAllOperations]; isn\'t working

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    N         


        
1条回答
  •  悲哀的现实
    2021-02-13 06:45

    Inside your block, particularly inside the loop, call -isCancelled on the operation. If it's true, then return.

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

    A queue can't just stop the operation's execution arbitrarily - what if some shared resources were being used by the operation that never got cleaned up? It's your responsibility to orderly end the operation when it becomes known to be cancelled. From Apple's docs:

    An operation object is responsible for calling isCancelled periodically and stopping itself if the method returns YES.

    0 讨论(0)
提交回复
热议问题