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

Tom*_*ift 18 iphone nsoperation nsoperationqueue ios

我正在使用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?

  }

}];
Run Code Online (Sandbox Code Playgroud)

使用NSBlockOperation是更好的方法吗?

jem*_*ons 51

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

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

[[self queue] addOperation:operation];
Run Code Online (Sandbox Code Playgroud)

这可以让你使用块,同时让你对操作有更多的控制......还有一些NSOperation细节(比如添加完成块的能力).

  • @Jake试试吧!它应该不起作用,因为在定义块时`operation`将是`nil`(或垃圾内存),这意味着它在块内是'nil`.注意问题:`![nil isCancelled]`将始终评估为'YES`,因此如果您实际上没有尝试取消操作,它可能*看起来像它正在工作. (3认同)