如果操作在块中,您无法真正检查是否需要取消操作。如果它在一个块中并且应该被取消,那么它就会被取消。访问 NSOperation 属性是不可能的,因为该块本身不是 NSOperation 实例。
示例代码:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSOperationQueue *q = [[NSOperationQueue alloc] init];
[q addOperationWithBlock:^{
[NSThread sleepForTimeInterval:10];
NSLog(@"Block 1");
}];
[q addOperationWithBlock:^{
[NSThread sleepForTimeInterval:3];
NSLog(@"Block 2");
}];
[q cancelAllOperations];
[NSThread sleepForTimeInterval:15];
[pool drain];
return 0;
}
如果您删除 cancelAllOperations 调用,那么这些块会按您的预期触发。
我建议,如果您需要对操作的取消状态进行更精细的控制并与 NSOperationQueue 相互作用,那么最好使用 NSOperation 而不是 NSBlockOperation。您可以继承 NSOperation 来完成此操作。