Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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 如果调用CancelAlloweactions,OperationQueue不会从队列中删除操作_Ios_Swift_Nsoperation_Nsoperationqueue - Fatal编程技术网

Ios 如果调用CancelAlloweactions,OperationQueue不会从队列中删除操作

Ios 如果调用CancelAlloweactions,OperationQueue不会从队列中删除操作,ios,swift,nsoperation,nsoperationqueue,Ios,Swift,Nsoperation,Nsoperationqueue,我有一个OperationQueue,我正在调用它CancelAlloRepeations,但如果我要求 OpearationQueue.operationcount它没有返回零 我正在覆盖取消方法一切正常,但operationcount不是零。是否应为零?请参阅NSOperation取消方法(我的重点): 此方法不会强制停止操作代码。相反,它会更新对象的内部标志以反映状态的更改。如果操作已完成执行,则此方法无效。取消当前在操作队列中但尚未执行的操作,可以比平常更早地从队列中删除操作 cance

我有一个OperationQueue,我正在调用它
CancelAlloRepeations
,但如果我要求
OpearationQueue.operationcount
它没有返回零

我正在覆盖取消方法一切正常,但
operationcount
不是零。是否应为零?

请参阅
NSOperation
取消方法(我的重点):

此方法不会强制停止操作代码。相反,它会更新对象的内部标志以反映状态的更改。如果操作已完成执行,则此方法无效。取消当前在操作队列中但尚未执行的操作,可以比平常更早地从队列中删除操作

cancel
方法将在操作处于队列中时将其标记为“就绪”,或者在操作不处于队列中时将其标记为立即完成。由于您的操作处于队列中,这意味着取消的操作将“更快”开始。如果子类划分正确,则取消的操作应立即标记为已完成,并生成其最终KVO通知。只有到那时,您的操作才会退出队列

有关取消自定义操作的更多信息,请参见

如果您需要知道操作队列在其<代码>操作< /代码>数组属性中有0个操作,则可以考虑使用KVO将队列所有者注册为<代码>操作数< /代码>密钥路径的观察者。然后,当通知您该属性的值已更改时,您可以检查该值是否为0,然后执行所需的任何逻辑。请注意,NSOperations在其运行的线程上发送KVO通知,如果从NSOperationQueue运行,则通常是后台线程-这意味着如果需要执行任何UI/阻塞逻辑,则需要确保它在主线程上运行


如果您决定使用KVO添加一个观察者,请确保稍后删除该观察者来平衡这一点。事实上,如果您确实决定利用KVO,我强烈建议您消化并通读,在使用该框架时,任何不尽职的行为都可能导致未定义的行为、内存泄漏,甚至坏访问崩溃。

不会自动将其从队列中删除或停止当前正在执行的操作。换句话说,操作必须意识到它们在启动并立即中止时被取消。我正在处理每个操作的取消,我想知道操作队列何时将使操作计数为零,是在调用所有操作的取消之后吗?