为自定义创建的串行异步队列设置优先级

6
如何使用GCD将高优先级设置到自定义创建的串行异步队列中?
我查看了这篇问答,其中建议使用dispatch_set_target_queue(),并将高优先级队列(DISPATCH_QUEUE_PRIORITY_HIGH)作为并发队列传递给自定义的串行异步队列。
我的理解是,这将使串行队列上的所有任务同时执行。我的理解正确吗?如果是这样,是否有其他解决方案?

1
为什么有人会在没有评论的情况下踩这个问题?我数了一下回答中有三个赞(截至2015年5月13日),这意味着这个问题帮助了至少三个人找到他们认为有价值的东西。有时候人们在这个网站上看起来很刻薄。 - Le Mot Juiced
2个回答

6

在iOS 8之前,将目标队列设置为高优先级队列是实现此操作的方法。尽管目标队列是并发的,但您的队列仍将保持串行。

从版本8.0开始,还有另一种方法可以实现这一点:

dispatch_queue_attr_t queueAttrs = dispatch_queue_attr_make_with_qos_class(
    DISPATCH_QUEUE_SERIAL,
    QOS_CLASS_USER_INITIATED /* Same as DISPATCH_QUEUE_PRIORITY_HIGH */, 
    0
);

dispatch_queue_t queue = dispatch_queue_create("myqueue",queueAttrs);

relative_priority 参数的文档说明如下: "相对于给定服务质量类别支持的最大调度优先级的负偏移量。该值必须小于 0 且大于 MIN_QOS_CLASS_PRIORITY。" 但是您在此处传递了 0 - Zev Eisenberg

5
你的队列仍然是串行的。它只是在全局高优先级并发后台队列的一个插槽中逐个执行其任务。一旦创建,串行队列无法通过任何方式“变为并发”。
同样地,如果你创建了一个并发队列,并将其设置为目标串行队列,它实际上会变成串行。
这些都在这个手册页面中有详细介绍。

你能否添加一些苹果文档的参考链接来证明这一点?因为我没有找到任何相关信息。此外,是否有一种方法可以将队列的优先级设置为仅次于主队列(main_queue())? - Pranav Jaiswal
已添加链接。你的意思是,“是否有一种方法只将优先级设置为紧随main_queue()之后的队列?”如果你的意思是“是否有一种设置队列优先级的方式,使得主线程始终具有最高优先级?”我的看法是,虽然没有证据证明,但你无法明确做到这一点;但事实上,任何目标优先级低于DISPATCH_QUEUE_PRIORITY_HIGH都可以满足该要求。 - ipmcc
我知道最高优先级队列是mainQueue()。我创建的自定义队列应该具有次高优先级。听起来清楚吗? - Pranav Jaiswal
说实话,你无法控制主队列的优先级。如果你认为主队列总是具有最高优先级,那么让一个队列具有次高优先级的方法就是将其定向到全局并发队列,并使用 DISPATCH_QUEUE_PRIORITY_HIGH - ipmcc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接