如何取消用addOperationWithBlock创build的操作?

我正在使用NSOperationQueue的addOperationWithBlock。 从该区块内,我该如何检查是否应该取消操作? 或者访问任何NSOperation属性/方法?

[myOperationQueue addOperationWithBlock: ^{ while ( /* long running loop */ ) { // how to determine here if I need to cancel? // for that matter, access any NSOperation properties/methods? } }]; 

是更好的方式来做到这一点使用NSBlockOperation?

更好的解决scheme可能是使用NSBlockOperation并将其添加到队列而不是原始块。 你可以做这样的事情:

 __block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ while(![operation isCancelled]){ //Some long operation } }]; [[self queue] addOperation:operation]; 

这可以让你使用块,同时给你更多的控制操作…还有一些NSOperation (例如添加完成块的能力,例如)。

如果在一个块中,你不能真正检查是否需要取消操作。 如果它在一个块,它应该被取消,那么它被取消。 访问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调用,那么这个块会像你期望的那样激发。

我会build议,如果你需要更好地控制操作的取消状态,并与NSOperationQueue相互作用,那么最好使用NSOperation而不是NSBlockOperation。 你可以inheritanceNSOperation来完成这个任务。