在NSoperationQueue上调用 - (void)cancelAllOperations没有设置队列中存在的NSOperation的isCancelled属性

时间:2013-05-05 15:53:17

标签: ios objective-c multithreading nsoperation nsoperationqueue

我遇到与NSoperationQueue相关的问题。 在我的代码中:

-(void) viewDidLoad
{
    //Initialisation of queue and operation.
    //adding operation to queue
    [self.operationQueue addOperation:op];

}

 -(void) viewWillDisappear:(BOOL)animated 
{
   [super viewWillDisappear:animated];
   [self.operationQueue cancelAllOperations];
}

因此,在检查isCancelled属性时,在执行我的NSOperation主函数时,它总是返回NO。在NSOperationQueue上调用cancellAllOperation之后的事实。 例如

-(void)main
{
   if(self.isCancelled)
   {
    // Never executing this block :-(
   }

 }

有关详细信息,我正在我的NSOperation中进行一些网络呼叫。当我切换到其他视图时,则调用cancelAllOperation。当网络响应回到我的NSOperation时,我正在检查是否(Self.isCancelled),现在我在另一个视图中(意味着isCancelled应该设置为YES)。但是这个检查总是失败。

2 个答案:

答案 0 :(得分:1)

viewDidLoad加载视图后,您的操作就会添加到队列中,然后队列将负责启动操作。

由于您在视图消失(viewWillDisappear)时取消操作,因此此操作最有可能在此时完成。换句话说,您的操作在终止后被取消。您可以检查isExecuting属性以了解操作是否正在运行。

答案 1 :(得分:1)

您的操作可能已不再运行,因此不会被取消。 (一旦您的操作完成,操作队列将不再跟踪它,因此调用cancelAllOperations将不会执行任何操作。)

如果您正在等待的网络响应正在调用回调而不是阻止对main的调用,则您的操作已经完成(主要返回时)。您可以通过使用“并发”操作来修复此问题(请参阅NSOperation文档;您可以指示何时完成,而不是仅在主要返回时自动完成)或使用同步网络调用(因此main不会返回你真的完成了。)