检查入队的GCD区块?

时间:2012-05-08 17:50:08

标签: objective-c grand-central-dispatch

假设我有一个串行调度队列,我在其上排队了几个操作。我已经读过,一旦发送,我就无法取消操作。是否有可能至少查看我发送的GCD块可能会做出决定,如果我想发送另一个?

例如,我将操作A发送到队列,但在我的应用程序决定将另一个操作A排入队列后不久,所以现在有两个操作排队了。

2 个答案:

答案 0 :(得分:2)

正如Kevin Ballard所说,你需要详细说明你究竟想做什么。你可以做的一件事就是设置一个标志,比如valid_然后你可以通过这样的方式有效地取消队列中当前项目以外的所有项目:

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

然后,只要您想“取消”队列,只需将valid_标记设置为NO即可。

再说一遍,提供更多关于你想做什么的信息,我可以给你一个更好的答案。

答案 1 :(得分:0)

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

这个问题是,这是两个以上的操作并且不是原子操作,所以你的操作完全可能在你获得操作数组之间完成,看看它是否是包含在那里。

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