Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 国家统计局运作及;NSOperationQueue取消_Ios_Objective C_Nsoperation_Nsoperationqueue - Fatal编程技术网

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 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];
到目前为止,一切正常,自定义操作开始执行

但是,当我从
应用程序调用我的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]的代码吗?