取消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池。