取消NSOperation for循环?

我试图在iOS上使用NSOperation在后台线程上执行search。 我不想要NSOperation子类,所以这就是我正在做的事情:

 [searchQueue cancelAllOperations]; NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self elector:@selector(filterContentForSearchText:) object:self.searchDisplayController.searchBar.text]; [searchQueue addOperation:op]; [op release]; 

search方法包括一个for循环,用于检查正在search的内容是否在数组中。 现在,当我通过调用cancelAllOperations取消NSOperation ,for循环继续在数组中运行。 我想阻止这一点,并想知道在for循环中调用它是否合法:

 if ([[[searchQueue operations] objectAtIndex:0] isCancelled]) { [tmp_array release]; // tmp_array is used to hold temporary results [pool drain]; // pool is my autorelease pool return; } 

NSOperation分类的原因之一是实施适当的取消。 你可以做你的方法,但是这违反了一些好的devise原则。 基本上,因为取消需要操作本身的配合,所以NSInvocationOperation不是build立在取消调用的同时已经在执行了(虽然它可以开始执行之前被成功取消),因为运行方法不应该知道它是如何调用。

相反,如果你NSOperation ,那么你可以很容易地把这个function的大部分放在main方法中:

 @implementation MyOperation - (void)main { if ([self isCancelled]) return; for (...) { // do stuff if ([self isCancelled]) { [tmp_array release]; return; } } } @end 

还要注意,你不必用这样的实现维护自己的autorelease池。