Ios 国家统计局运作及;NSOperationQueue取消
在Ios 国家统计局运作及;NSOperationQueue取消,ios,objective-c,nsoperation,nsoperationqueue,Ios,Objective C,Nsoperation,Nsoperationqueue,在NSOperationQueue实例中排队的一些自定义NSOperation实例中,我遇到了一些奇怪的问题: 当我调用[myOperation cancel]或[myOperationQueue cancelAllOperations]时,取消的getter对于我的自定义NSOperation子类实例保持不变 我试图在调用app delegateapplicationWillResignActive方法时取消这些操作 我对NSOperation子类的实现如下: 自定义初始化方法 实施的主要
NSOperationQueue
实例中排队的一些自定义NSOperation
实例中,我遇到了一些奇怪的问题:
当我调用[myOperation cancel]
或[myOperationQueue cancelAllOperations]
时,取消的getter对于我的自定义NSOperation
子类实例保持不变
我试图在调用app delegateapplicationWillResignActive
方法时取消这些操作
我对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];
到目前为止,一切正常,自定义操作开始执行
但是,当我从应用程序调用我的singleton的另一个方法时,将使用[myCustomOperation cancel]
或[myNSOperationQueueInstance cancelAllOperations]
取消我的自定义操作布尔值保持不变(我在自定义操作的执行循环中定期检查isCancelled
)
另一件有趣的事情是,在应该取消操作的相同方法中,如果我使用NSLog检查isCancelled,isExecuting,isAsynchronous
,布尔值被设置为NO
,但是isFinished
布尔值被设置为YES
,即使操作当时正在执行
另外,如果我尝试使用operations
属性查看在我的NSOperationQueue
中排队的操作,则数组为空
如果我重写cancel
属性及其NSOperation
子类的setter方法,它将按预期工作
我还向系统请求了一个长时间运行的后台任务,该任务工作正常,所以问题不在于在操作取消之前应用程序处于非活动状态
我缺少什么?为什么被取消
getter没有更改,为什么NSOperationQueue
的操作
数组属性是空的,尽管事实上我添加了操作并且它们在查询数组时执行,为什么已完成
布尔值在操作时设置为YES
s正在执行?多亏了@KenThomases和@lead_the_the_zeppelin(参见OP中的注释),我才能够准确地指出代码中的缺陷:
由于我创建了自定义的NSOperation
子类来将数据导入核心数据模型,因此我的缺陷是执行从子类的-main
方法调用的导入的代码嵌入了ManagedObjectContex的异步performBlock
方法的块回调范围内t
,我正在使用它来管理导入执行
所以发生的事情是,-main
中的代码在另一个线程中异步运行,而我的操作实例报告它已完成执行,这并不奇怪。在我的情况下,为了解决这个问题,我使用performBlock:
更改了performBlock:
结论:如果您遇到与我相同的问题,请检查在自定义NSOperation
子类-main
实例方法中运行的代码是否不异步运行。只是检查一下,您是否调用了[myCustomOperation start]
在您的自定义NSOperation上?否,因为它们不是并发的,我不想手动启动它们。我想允许NSOperationQueue启动它们。我也没有覆盖子类的start
方法。并且您的-main
是同步的?它在操作完全完成之前不会返回?因此您的操作通常直到完全完成后才返回?您能澄清一下吗?您的代码是[myNSOperationQueueInstance addOperations:@[myCustomOperation\u 1,myCustomOperation\u 2]waituntilffinished:NO];
您能发布[MyCustomOperationClass customInit]的代码吗?