繁体   English   中英

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

[英]OperationQueue is not removing the operations from queue if I call cancelAllOpeartions

我有一个opeationqueue,我在上面调用cancelAllOpeations但是如果我问OpearationQueue.operationcount它不会让我零。

我重写方法取消一切正常,但opertioncount不zero.is它预期?

有关NSOperation cancel方法,请参阅Apple的API文档 (重点是我的):

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

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

另请参阅响应取消命令以获取有关取消自定义操作的更多信息。

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

如果决定使用KVO添加观察者,请确保稍后通过删除观察者来达到平衡。 实际上,如果您决定使用KVO,我强烈建议您消化所有KVO编程指南并通读KVO API文档 ,如果在使用该框架时进行任何尽职调查,可能会导致不确定的行为,内存泄漏,甚至bad_access崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM