为什么取消所有操作不会删除所有操作?

时间:2013-05-06 09:11:39

标签: objective-c

[oqlMyOperationQueue cancelAllOperations];

PO([oqlMyOperationQueue operations]);

我仍然在那里看到一堆操作。

2013-05-06 16:05:38.559  [oqlMyOperationQueue operations]: (
    "<NSBlockOperation: 0x20222730>",
    "<NSBlockOperation: 0x2041f7a0>",
    "<NSBlockOperation: 0x20450830>",
    "<NSBlockOperation: 0x20417bf0>",
    "<NSBlockOperation: 0x2006d510>",
    "<NSBlockOperation: 0x2000d150>",
    "<NSBlockOperation: 0x20379810>",
    "<NSBlockOperation: 0x2021f8f0>",
    "<NSBlockOperation: 0x2045dca0>",
    "<NSBlockOperation: 0x2024c670>",
    "<NSBlockOperation: 0x2041b8e0>",
    "<NSBlockOperation: 0x203d54a0>",
    "<NSBlockOperation: 0x20442c80>",
    "<NSBlockOperation: 0x20452930>",
    "<NSBlockOperation: 0x20363af0>"
)

但我取消了所有操作。那有什么问题?

好的,我知道如果一个操作已经在执行,它将保留在队列中。但是为什么还有这么多呢?队列是串行的。

3 个答案:

答案 0 :(得分:5)

引用NSOperationQueue documentation

  

此方法向当前的所有操作发送取消消息   队列。排队操作在开始执行之前被取消。如果   一个操作已经在执行,由该操作决定   认识到取消并停止它正在做什么。

cancelAllOperations不会清除队列,而是通知队列中当前所有取消它们的操作。进一步引用文档(强调我的):

  

添加后,无法直接从队列中删除操作。在报告之前,操作仍保留在队列中   它完成了它的任务。完成任务不一定   意味着操作执行该任务完成。一个   操作也可以取消。 取消操作对象   队列中的对象,但通知对象应该中止   它的任务尽快完成。

答案 1 :(得分:2)

来自docs(强调我的):

  

此方法向当前队列中的所有操作发送取消消息。排队操作在开始执行之前被取消。 如果操作已在执行,则由该操作识别取消并停止正在执行的操作。

答案 2 :(得分:0)

回答此评论

  

那么如何清除队列?

子类NSOperation。添加条件以检查操作是否在开始时以及在执行数据调用以获取图像或操作正在执行的任何冗长任务之前是否已取消操作。

if (!self.isCancelled) 
    // then do something 
else 
    return;

如果操作涉及多个数据调用,最好在每次调用之前添加检查。这应该会阻止当前操作进一步执行。队列中剩余的操作也将停止。