我在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
?
答案 0 :(得分:2)
感谢 @KenThomases 和 @lead_the_zeppelin (请参阅OP中的评论)我能够查明代码中的缺陷:
由于我创建了自定义NSOperation
子类以将数据导入Core Data模型,我的缺点是执行从子类的-main
方法调用的导入的代码嵌入在我用来管理导入执行的performBlock
的异步ManagedObjectContext
方法的块回调范围。
所以发生的事情是-main
内的代码在另一个线程中异步运行而不是我的操作实例,毫不奇怪,它报告它已完成执行。就我而言,为解决此问题,我使用performBlock:
更改了performBlockAndWait:
。
结论:如果遇到过像我这样的问题,请检查自定义NSOperation
子类-main
实例方法中运行的代码是否不是异步运行。< / p>