xCode 4.4.1 OSX 10.8.2, looks like [operation cancelAllOperations]; isn\'t working
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
N
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.