【问题标题】:Inspect enqueued GCD blocks?检查排队的 GCD 块?
【发布时间】:2012-05-17 01:49:40
【问题描述】:

假设我有一个串行调度队列,我将几个操作排入队列。我已经读到,一旦操作被调度,我就无法取消操作。是否有可能至少查看我已分派的 GCD 块是否可以决定是否要分派另一个块?

例如,我将操作 A 分派到队列中,但在我的应用程序决定将另一个操作 A 加入队列后不久,因此现在有 2 个操作在排队。

【问题讨论】:

  • 你能详细说明你想要做什么吗?根据您的实际目标,有多种解决方案。

标签: objective-c grand-central-dispatch


【解决方案1】:

正如凯文巴拉德所说,您需要详细说明您正在尝试做什么。您可以做的一件事是设置一个标志,例如valid_,然后您可以通过执行以下操作有效地取消队列中除当前项目之外的所有项目:

dispatch_async(queue, ^{
  if (valid_) {
    // perform your task here
  }
});

然后,每当您想“取消”队列时,只需将您的 valid_ 标志设置为 NO

不过,请再次提供有关您要做什么的更多信息,我可以给您更好的答案。

【讨论】:

    【解决方案2】:

    由于 NSOperation 现在构建在 GCD 之上,您现在可以使用 addOperationWithBlock: 将您的块放在 NSOperationQueue 上,然后您可以在 NSOperationQueue 上调用 操作 来得到一个未完成操作的 NSArray。

    问题在于,这是两个以上的操作并且不是原子的,因此您的操作完全有可能在您获得 operations 数组并查看它是否为包含在那里。

    https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html

    但是,NSOperations 有一个先决条件 API,因此您可以将另一个操作排入队列,该操作仅在您的第一个 NSOperation 完成时才会运行,并使用它来跟踪您何时应该再次尝试将您的第一个 NSOperation 排入队列。

    https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004591

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2013-10-11
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多