的NSOperation和NSOperationQueue取消
我遇到一些奇怪的问题,有一些自定义NSOperation
情况下,在NSOperationQueue
实例排队:的NSOperation和NSOperationQueue取消
当我打电话或者[myOperation cancel]
或[myOperationQueue cancelAllOperations]
的isCancelled
getter是否cancel
布尔为我定制NSOperation
子保持不变实例。
我试图取消应用程序代表applicationWillResignActive
方法被调用时的操作。
我对NSOperation
子类实现是这样的:
- 定制init方法
- 实现主
我有我的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
检查同样的方法,即使操作是在那个时候执行。
此外,如果我尝试使用operations
属性查看我的NSOperationQueue
中排队的操作,则该数组为空。
如果我重写cancel
属性及其设置方法NSOperation
子类,它按预期工作。
我还要求系统运行良好的长时间运行的后台任务,所以问题不是应用程序在操作可能取消之前变为非活动状态。
我错过了什么?为什么isCancelled
getter没有改变,为什么的数组属性是空的,尽管事实上我添加了这些操作,并且它们在询问数组时执行,并且为什么isFinished
布尔值在执行操作时设置为YES
?
由于@KenThomases和@lead_the_zeppelin(见OP评论)我能找出缺陷在我的代码:
我公司自创建自定义NSOperation
子类导入数据到核心数据模型,我的缺点是,执行从子类的-main
方法调用导入的代码,嵌入在ManagedObjectContext
异步performBlock
方法的块回调的范围内,该方法用于管理导入执行。
所以发生了什么事是-main
内的代码异步运行在另一个线程比我的操作实例,毫不奇怪,报告说它完成了它的执行。在我的情况下,为了解决这个问题,我改变了performBlock:
与performBlockAndWait:
。
结论:如果你遇到像我一样的问题,检查代码自定义NSOperation
子类-main
实例方法中的运行不会异步运行。
只是检查,你是否在你的自定义NSOperation上调用'[myCustomOperation start]'? –
不,因为它们不是并发的,我不想手动启动它们。我想让NSOperationQueue启动它们。我也没有重写子类的'start'方法。 – Razvan
你的'-main'是同步的吗?在操作完成之前它不会返回? –