2015-06-17 39 views
4

我遇到一些奇怪的问题,有一些自定义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的布尔值被设置为NOisFinished布尔值被设置为YES检查同样的方法,即使操作是在那个时候执行。

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

如果我重写cancel属性及其设置方法NSOperation子类,它按预期工作。

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

我错过了什么?为什么isCancelled getter没有改变,为什么的数组属性是空的,尽管事实上我添加了这些操作,并且它们在询问数组时执行,并且为什么isFinished布尔值在执行操作时设置为YES

+0

只是检查,你是否在你的自定义NSOperation上调用'[myCustomOperation start]'? –

+0

不,因为它们不是并发的,我不想手动启动它们。我想让NSOperationQueue启动它们。我也没有重写子类的'start'方法。 – Razvan

+1

你的'-main'是同步的吗?在操作完成之前它不会返回? –

回答

1

由于@KenThomases@lead_the_zeppelin(见OP评论)我能找出缺陷在我的代码:

我公司自创建自定义NSOperation子类导入数据到核心数据模型,我的缺点是,执行从子类的-main方法调用导入的代码,嵌入在ManagedObjectContext异步performBlock方法的块回调的范围内,该方法用于管理导入执行。

所以发生了什么事是-main内的代码异步运行在另一个线程比我的操作实例,毫不奇怪,报告说它完成了它的执行。在我的情况下,为了解决这个问题,我改变了performBlock:performBlockAndWait:

结论:如果你遇到像我一样的问题,检查代码自定义NSOperation子类-main实例方法中的运行不会异步运行。