7

我面临与 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];
}

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

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

 }

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

4

2 回答 2

1

您的操作在加载视图后立即添加到队列中viewDidLoad,然后队列将承担开始操作的责任。

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

于 2013-05-05T16:19:11.403 回答
1

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

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

于 2013-05-06T00:22:02.613 回答