Ios 如果调用CancelAlloweactions,OperationQueue不会从队列中删除操作
我有一个OperationQueue,我正在调用它Ios 如果调用CancelAlloweactions,OperationQueue不会从队列中删除操作,ios,swift,nsoperation,nsoperationqueue,Ios,Swift,Nsoperation,Nsoperationqueue,我有一个OperationQueue,我正在调用它CancelAlloRepeations,但如果我要求 OpearationQueue.operationcount它没有返回零 我正在覆盖取消方法一切正常,但operationcount不是零。是否应为零?请参阅NSOperation取消方法(我的重点): 此方法不会强制停止操作代码。相反,它会更新对象的内部标志以反映状态的更改。如果操作已完成执行,则此方法无效。取消当前在操作队列中但尚未执行的操作,可以比平常更早地从队列中删除操作 cance
CancelAlloRepeations
,但如果我要求
OpearationQueue.operationcount
它没有返回零
我正在覆盖取消方法一切正常,但operationcount
不是零。是否应为零?请参阅NSOperation
取消方法(我的重点):
此方法不会强制停止操作代码。相反,它会更新对象的内部标志以反映状态的更改。如果操作已完成执行,则此方法无效。取消当前在操作队列中但尚未执行的操作,可以比平常更早地从队列中删除操作
cancel
方法将在操作处于队列中时将其标记为“就绪”,或者在操作不处于队列中时将其标记为立即完成。由于您的操作处于队列中,这意味着取消的操作将“更快”开始。如果子类划分正确,则取消的操作应立即标记为已完成,并生成其最终KVO通知。只有到那时,您的操作才会退出队列
有关取消自定义操作的更多信息,请参见
如果您需要知道操作队列在其<代码>操作< /代码>数组属性中有0个操作,则可以考虑使用KVO将队列所有者注册为<代码>操作数< /代码>密钥路径的观察者。然后,当通知您该属性的值已更改时,您可以检查该值是否为0,然后执行所需的任何逻辑。请注意,NSOperations在其运行的线程上发送KVO通知,如果从NSOperationQueue运行,则通常是后台线程-这意味着如果需要执行任何UI/阻塞逻辑,则需要确保它在主线程上运行
如果您决定使用KVO添加一个观察者,请确保稍后删除该观察者来平衡这一点。事实上,如果您确实决定利用KVO,我强烈建议您消化并通读,在使用该框架时,任何不尽职的行为都可能导致未定义的行为、内存泄漏,甚至坏访问崩溃。不会自动将其从队列中删除或停止当前正在执行的操作。换句话说,操作必须意识到它们在启动并立即中止时被取消。我正在处理每个操作的取消,我想知道操作队列何时将使操作计数为零,是在调用所有操作的取消之后吗?