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

时间:2017-03-28 12:54:00

标签: ios swift nsoperation nsoperationqueue

我有一个我正在打电话OpearationQueue.operationcount的操作,但如果我问的话 opertioncount它并没有让我退缩零。

我重写取消方法一切正常,但{{1}}不是零。是否预期?

1 个答案:

答案 0 :(得分:1)

请参阅Apple's API Document了解NSOperation cancel方法(强调我的方法):

  

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

cancel方法会将操作标记为' ready'如果它在队列中,或者如果它不在队列中则立即标记。由于您的操作在队列中,这意味着取消的操作将更快开始。如果分类正确,您取消的操作应立即标记为已完成并生成其最终的KVO通知。只有这样,你的行动才会出现。

有关取消自定义操作的详细信息,另请参阅Responding to the Cancel Command

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

如果您决定使用KVO添加观察者,请确保稍后通过移除观察者来平衡该观察者。事实上,如果您决定利用KVO,我强烈建议您消化所有KVO programming guide并阅读KVO API docs,在使用该框架时,如果没有尽职调查,可能会导致未定义的行为,内存泄漏,甚至bad_access崩溃。