我遇到与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)。但是这个检查总是失败。
答案 0 :(得分:1)
在viewDidLoad
加载视图后,您的操作就会添加到队列中,然后队列将负责启动操作。
由于您在视图消失(viewWillDisappear
)时取消操作,因此此操作最有可能在此时完成。换句话说,您的操作在终止后被取消。您可以检查isExecuting
属性以了解操作是否正在运行。
答案 1 :(得分:1)
您的操作可能已不再运行,因此不会被取消。 (一旦您的操作完成,操作队列将不再跟踪它,因此调用cancelAllOperations
将不会执行任何操作。)
如果您正在等待的网络响应正在调用回调而不是阻止对main
的调用,则您的操作已经完成(主要返回时)。您可以通过使用“并发”操作来修复此问题(请参阅NSOperation文档;您可以指示何时完成,而不是仅在主要返回时自动完成)或使用同步网络调用(因此main不会返回你真的完成了。)