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
你的块中,特别是在循环内,调用-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。