【问题标题】:Cancel NSOperation in for loop?在for循环中取消NSOperation?
【发布时间】:2010-12-20 18:51:22
【问题描述】:

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

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

搜索方法包含一个 for 循环,用于检查正在搜索的内容是否在数组中。现在,当我通过调用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;
}

【问题讨论】:

    标签: iphone objective-c ios nsoperation nsoperationqueue


    【解决方案1】:

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

    相反,如果您将NSOperation 子类化,您可以非常轻松地将大部分功能放入main 方法中:

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2011-04-15
      • 1970-01-01
      • 2015-10-30
      相关资源
      最近更新 更多