关于IOS全局队列,这是一个好主意,我们可以使用它来通过子线程来利用多核CPU,但是现在我的问题是如何在从队列调度后管理这些子线程?似乎Apple没有提供这样的API。
例如,我创建了一个串行队列,对于某个作业因某种原因被阻止的情况,整个队列也将被阻止。事实上我们想要管理这项工作,目前似乎没有找到方法。
任何讨论都将受到赞赏,在此先感谢。
答案 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)