NSOperation& NSOperationQueue取消

时间:2015-06-17 19:45:22

标签: ios objective-c nsoperation nsoperationqueue

我在NSOperation个实例中排队的一些自定义NSOperationQueue个实例遇到了一些奇怪的问题:

当我调用[myOperation cancel][myOperationQueue cancelAllOperations]时,isCancelled布尔值的cancel getter对于我的自定义NSOperation子类实例保持不变。

我正在尝试在调用app delegate applicationWillResignActive方法时取消操作。

我对NSOperation子类的实现是这样的:

  • 自定义初始化方法
  • 已实施主要

我有一个对我的NSOperation子类和NSOperationQueue实例的实例有强引用的单例。

在该单身人士的方法中,我执行以下操作:

myNSOperationQueueInstance = [[NSOperationQueue alloc] init];
myCustomOperation_1 = [MyCustomOperationClass alloc] customInit];
myCustomOperation_2 = [MyCustomOperationClass alloc] customInit];

[myNSOperationQueueInstance addOperations:@[myCustomOperation_1,myCustomOperation_2] waitUntilFinished:NO];

到目前为止,一切都按预期工作,自定义操作开始执行。

但是,当我从applicationWillResignActive调用我的单身人士的另一种方法来取消使用[myCustomOperation cancel][myNSOperationQueueInstance cancelAllOperations]的自定义操作时,isCancelled布尔值保持不变(我检查isCancelled定期执行自定义操作的执行循环。

另一个有趣的事情是,在同一个应该取消操作的方法中,如果我用NSLog检查isCancelled, isExecuting, isAsynchronous布尔值设置为NO但是isFinished布尔值设置为YES即使操作正在执行。

另外,如果我尝试使用NSOperationQueue属性查看operations中排队的操作,则数组为空。

如果我覆盖cancel属性及其NSOperation子类的setter方法,它将按预期工作。

我还要求系统长时间运行的后台任务工作得很好,所以问题不是应用程序在操作取消之前变为非活动状态。

我错过了什么?为什么isCancelled getter没有改变,为什么operations的{​​{1}}数组属性为空,尽管事实上我添加了操作并且在查询数组时它们正在执行以及为什么{ {1}}当操作正在执行时,boolean设置为NSOperationQueue

1 个答案:

答案 0 :(得分:2)

感谢 @KenThomases @lead_the_zeppelin (请参阅OP中的评论)我能够查明代码中的缺陷:

由于我创建了自定义NSOperation子类以将数据导入Core Data模型,我的缺点是执行从子类的-main方法调用的导入的代码嵌入在我用来管理导入执行的performBlock的异步ManagedObjectContext方法的块回调范围。

所以发生的事情是-main内的代码在另一个线程中异步运行而不是我的操作实例,毫不奇怪,它报告它已完成执行。就我而言,为解决此问题,我使用performBlock:更改了performBlockAndWait:

结论:如果遇到过像我这样的问题,请检查自定义NSOperation子类-main实例方法中运行的代码是否不是异步运行。< / p>