如何取消用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来完成这个任务。