假设我有一个串行调度队列,我将几个操作排入队列。我已经读到,一旦操作被调度,我就无法取消操作。是否有可能至少查看我已分派的 GCD 块是否可以决定是否要分派另一个块?
例如,我将操作 A 分派到队列中,但在我的应用程序决定将另一个操作 A 加入队列后不久,因此现在有 2 个这样的操作排队。
假设我有一个串行调度队列,我将几个操作排入队列。我已经读到,一旦操作被调度,我就无法取消操作。是否有可能至少查看我已分派的 GCD 块是否可以决定是否要分派另一个块?
例如,我将操作 A 分派到队列中,但在我的应用程序决定将另一个操作 A 加入队列后不久,因此现在有 2 个这样的操作排队。
正如凯文巴拉德所说,你需要详细说明你到底想要做什么。您可以做的一件事是设置一个标志,例如valid_
,然后您可以通过执行以下操作有效地取消队列中除当前项目之外的所有项目:
dispatch_async(queue, ^{
if (valid_) {
// perform your task here
}
});
然后,每当您想“取消”队列时,只需将您的valid_
标志设置为NO
.
不过,请再次提供有关您要做什么的更多信息,我可以给您更好的答案。
由于 NSOperation 现在构建在 GCD 之上,您现在可以使用addOperationWithBlock:将您的块放在 NSOperationQueue 上,然后您可以调用NSOperationQueue 上的操作来获取未完成操作的 NSArray。
问题在于,这是两个以上的操作并且不是原子的,因此您的操作完全有可能在您获取操作数组并查看它是否包含在其中之间完成。
但是,NSOperation 有一个先决条件 API,因此您可以将另一个操作排入队列,该操作仅在您的第一个 NSOperation 完成时才会运行,并使用它来跟踪何时应该再次尝试将您的第一个 NSOperation 排入队列。