2017-03-28 26 views
0

我有opeationqueue我打电话cancelAllOpeations,但如果我问 OpearationQueue.operationcount它没有回到我零。OperationQueue是不是从队列中删除操作,如果我呼叫cancelAllOpeartions

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

+0

[取消操作](https://developer.apple.com/reference/foundation/operationqueue/1417849-cancelalloperations)不会自动将其从队列中移除或停止当前正在执行的操作。换句话说,操作必须意识到它们在被立即中止时被取消 –

+0

我正在处理每个操作的取消操作,我想知道操作队列何时使操作计数为零,是否在取消所有操作之后调用? – Santhosh

回答

0

Apple's API DocumentNSOperationcancel方法(重点煤矿):

此方法不会强迫你的操作码停止。相反,它会更新对象的内部标志以反映状态的变化。如果操作已经完成执行,则此方法不起作用。取消当前在操作队列中但尚未执行的操作使得可以从队列中移除比通常更早的操作

cancel方法要么标记操作为“准备好”,如果它是在队列中,或将其标记立即完成,如果它不是在队列中。由于您的操作处于队列中,这意味着取消的操作将“更早”开始。如果分类正确,您的取消操作应该立即标记完成并生成最终的KVO通知。只有这样你的行动才会被取消。

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

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

如果您决定使用KVO添加观察者,请确保通过稍后移除观察者来平衡观察者。事实上,如果你决定利用KVO,我强烈建议你消化所有的KVO programming guide并仔细阅读KVO API docs,任何缺乏尽职调查的工作时都会导致未定义的行为,内存泄漏甚至是bad_access崩溃。