1
[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>"
)

但是我已经取消了所有的操作。所以有什么问题?

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

4

3 回答 3

5

引用NSOperationQueue文档

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

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

添加操作后,您不能直接从队列中删除操作。一个操作保留在它的队列中,直到它报告它完成了它的任务。完成其任务并不一定意味着该操作已完成该任务。也可以取消操作。取消操作对象会使对象留在队列中,但会通知对象它应该尽快中止其任务。

于 2013-05-06T09:14:57.063 回答
2

文档(强调我的):

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

于 2013-05-06T09:14:35.990 回答
0

回答这个评论

那么如何清除队列呢?

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

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

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

于 2014-03-28T08:05:48.040 回答