Swift 是否可以为“DispatchQueue.concurrentPerform”指定“DispatchQueue”?

Swift 是否可以为“DispatchQueue.concurrentPerform”指定“DispatchQueue”?,swift,grand-central-dispatch,Swift,Grand Central Dispatch,将调度队列作为参数,允许您选择在哪个队列上执行块 我的理解是,Swift中的DispatchQueue.concurrentPerform旨在取代dispatch\u apply。但此函数不将调度队列作为参数。在谷歌上搜索后,我发现其中有以下代码: let _ = DispatchQueue.global(qos: .userInitiated) DispatchQueue.concurrentPerform(iterations: addresses.count) { index in

将调度队列作为参数,允许您选择在哪个队列上执行块

我的理解是,Swift中的
DispatchQueue.concurrentPerform
旨在取代
dispatch\u apply
。但此函数不将调度队列作为参数。在谷歌上搜索后,我发现其中有以下代码:

let _ = DispatchQueue.global(qos: .userInitiated)
DispatchQueue.concurrentPerform(iterations: addresses.count) { index in
    // do work here
}
并解释:

这个实现包括一行奇怪的代码:
let\uqs=DispatchQueue.global(qos:.userInitiated)
。调用此命令将导致GCD使用带有
.userInitiated
服务质量的队列来处理并发调用

我的问题是,这真的可以用来指定QoS吗?如果是,怎么做


对我来说,没有办法为此指定队列是有意义的,因为串行队列在这种情况下没有意义,并且只有最高的QoS才有意义,因为这是一个同步阻塞函数。但是我找不到任何文档说明为什么可以使用
dispatch\u apply
指定队列,但不可能使用
DispatchQueue.concurrentPerform
指定队列服务质量(QoS)的尝试是不正确的。
concurrentPerform
尽可能使用当前队列的QoS。您可以通过跟踪源代码来确认这一点:

  • concurrent执行
    调用

  • 使用
    0
    调用
    dispatch\u apply
    ,即
    dispatch\u apply\u AUTO
    ,这是一个

    。。。常数传递到
    dispatch\u apply()
    dispatch\u apply\u f()
    以请求系统自动使用与当前线程配置尽可能匹配的工作线程

    提交块进行并行调用时,将此常量作为队列参数传递将自动使用与调用方的服务质量最匹配的全局并发队列

  • 这也可以通过以下
    dispatch\u apply
    call
    dispatch\u apply\u f
    进行确认,其中使用
    dispatch\u apply\u AUTO
    会导致调用。如果您一直在的兔子洞中翻滚,您将看到这实际上使用了一个全局队列,它与您当前的线程具有相同的QoS

  • 总之,指定QoS的正确方法是将调用分派到
    concurrentPerform
    到所需队列,例如:

    DispatchQueue.global(qos: .userInitiated).async {
        DispatchQueue.concurrentPerform(iterations: 3) { (i) in
            ...
        }
    }
    
    通过添加断点并查看Xcode调试器中的队列,可以很容易地从经验上验证这一点:


    不用说,添加
    let=…
    的建议是不正确的。考虑以下事项:

    DispatchQueue.global(qos: .utility).async {
        let _ = DispatchQueue.global(qos: .userInitiated)
    
        DispatchQueue.concurrentPerform(iterations: 3) { (i) in
            ...
        }
    }
    
    这将使用“实用程序”QoS运行,而不是“用户启动”

    同样,这很容易通过经验验证:



    请参阅WWDC 2017视频,了解有关
    调度\u应用\u自动
    concurrentPerform

    的讨论,感谢您的详细回答。我知道教程中的代码可能是错误的,但是raywenderlich.com教程通常是非常可靠的。