【发布时间】:2013-05-05 15:53:16
【问题描述】:
我遇到了与 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)。但这个检查总是失败。
【问题讨论】:
-
您确定在您调用 cancelAllOperations 时您的操作尚未开始吗?您需要检查在整个操作执行过程中设置的 isCancelled 属性。
-
我一直在我的操作主方法中检查 isCancelled 属性。我通过断点进行调试,发现调用 cancelAllOperation 方法后,当调用返回到此检查点 if(self.isCancelled) 时,它总是返回 NO。
-
您是否在您的 NSOperation 上覆盖
cancel方法?如果是这样,你可以发布它吗?如果没有,您可以覆盖(调用 super)并在那里放置一个日志或断点以查看它是否被调用? -
是的,我试图覆盖 NSOperation 子类中的 -(void)cancel 方法。它永远不会被调用。但是如果我在 viewDidLoad 中的 addOpperation 之后调用 cancelAllOperation,它就会被调用。
-
在所有方法中记录对象的身份。确保您正在对您认为自己是的对象进行操作。例如,它 (
self) 是同一个实例吗?self.operationQueue两个地方都一样吗?
标签: ios objective-c multithreading nsoperation nsoperationqueue