我正在尝试使用在后台线程上实现搜索NSOperation
on iOS
。我不想子类化NSOperation
所以这就是我正在做的:
[searchQueue cancelAllOperations];
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self
elector:@selector(filterContentForSearchText:)
object:self.searchDisplayController.searchBar.text];
[searchQueue addOperation:op];
[op release];
搜索方法包括一个 for 循环,用于检查正在搜索的内容是否在数组中。现在当我取消NSOperation
通过致电cancelAllOperations
,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
一是实行适当取消。您可以采用您的方法,但它违反了一些良好的设计原则。基本上,由于取消需要操作本身的配合,NSInvocationOperation
不是为了在已经执行时取消调用而构建的(尽管可以成功取消before它开始执行),因为正在运行的方法不应该知道它是如何被调用的。
相反,如果你子类化NSOperation
,您可以将大部分功能放入main
方法非常简单:
@implementation MyOperation
- (void)main {
if ([self isCancelled])
return;
for (...) {
// do stuff
if ([self isCancelled]) {
[tmp_array release];
return;
}
}
}
@end
另请注意,您不必使用此类实现来维护自己的自动释放池。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)