4

我正在尝试使用NSOperationon在后台线程上实现搜索iOS。我不想继承NSOperation,所以这就是我正在做的事情:

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

search 方法包括一个 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;
}
4

1 回答 1

8

子类化的原因之一NSOperation是实现适当的取消。你可以做你的方法,但它违反了几个好的设计原则。基本上,由于取消需要操作本身的合作,NSInvocationOperation因此不会在调用已经执行时取消调用(尽管它可以在开始执行之前成功取消),因为正在运行的方法不应该知道它是如何被调用的.

相反,如果您子类化,您可以很容易地NSOperation将大部分功能放入方法中:main

@implementation MyOperation
- (void)main {
    if ([self isCancelled])
        return;

    for (...) {
        // do stuff

        if ([self isCancelled]) {
            [tmp_array release];
            return;
        }
    }
}

@end

另请注意,您不必使用此类实现维护自己的自动释放池。

于 2010-12-20T18:58:01.533 回答