如何取消使用addOperationWithBlock创建的操作?

时间:2011-02-10 21:05:01

标签: iphone ios nsoperation nsoperationqueue

我正在使用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是更好的方法吗?

2 个答案:

答案 0 :(得分:50)

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

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

[[self queue] addOperation:operation];

这使您可以使用块,同时可以更好地控制操作...以及更多NSOperation个细节(例如,添加完成块的功能)。

答案 1 :(得分:2)

如果在一个区块中,你无法真正检查是否需要取消操作。如果它在一个区块中并且它应该被取消则会被取消。无法访问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来完成此任务。