关于IOS中的全局队列。

时间:2012-09-09 12:25:48

标签: ios queue block

关于IOS全局队列,这是一个好主意,我们可以使用它来通过子线程来利用多核CPU,但是现在我的问题是如何在从队列调度后管理这些子线程?似乎Apple没有提供这样的API。

例如,我创建了一个串行队列,对于某个作业因某种原因被阻止的情况,整个队列也将被阻止。事实上我们想要管理这项工作,目前似乎没有找到方法。

任何讨论都将受到赞赏,在此先感谢。

3 个答案:

答案 0 :(得分:2)

一旦将块分派给队列,它就会执行。没有API来阻止它。

您可以suspend队列,这会导致挂起块在队列恢复之前不会执行。但是,没有办法阻止阻止。

传统方法是在代码中“检查”以查看运行块是否应该提前停止。

// return early from block
if (shouldStop) return;

请注意,您所看到的“问题”是串行队列的确切定义。它只允许操作按照提交到队列的顺序进行处理。你必须等待你前面的那些完成。

您还可以查看NSOperationQueue,它提供了一种更容易的机制来取消队列中等待的块,但是停止正在执行的块的唯一方法是在块中实现该机制。

如果您发现必须取消大量“阻挡”块,那么您的设计很可能存在缺陷,您需要重新审视您的设计。

此外,如果正在等待的任务“后面”的任务确实不需要等待该任务,那么为什么要将它们放在串行队列中呢?使用并发队列,或单独的串行队列或其他一些机制。

现在,让我说明你不应该使用调度队列来阻止I / O操作。你可以这样做,而且通常它是最容易的,但是如果你想要你的应用程序的最佳性能特性,你应该使用dispatch_io,它将更好地与其他CPU密集型线程集成。

我想这里的重要内容应该是,而不是试图得到一个答案,例如“当当前运行的块被阻止时,如何在串行队列上运行块?”您应该问自己如何更好地设计应用程序,以便您没有这种情况。

如果不必执行工作,则不要等待它。如果必须完成工作,你只需要等待......

答案 1 :(得分:0)

如果您需要更好地控制后台队列,而不是使用GCD和全局队列,请查看NSOperationQueue,它提供了cancelAllOperations方法。我假设您正在使用全局队列,因为您需要并发后台任务,在这种情况下,您可以查看NSOperationQueue的{​​{3}},这可以让您将队列定义为并发。

有关操作队列的更多详细信息,请参阅setMaxConcurrentOperationCount

答案 2 :(得分:0)

我认为您需要的是为您的任务创建自己的队列,并使其并发并根据需要设置优先级。所以你的任务不会被阻止。

let queueAttr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_USER_INITIATED, 0)

let callbackQueue = dispatch_queue_create("myqueue", queueAttr)