默认情况下,是DispatchQueue .serial还是.concurrent?

时间:2016-06-29 22:58:45

标签: cocoa grand-central-dispatch

这就是问题,直截了当。

let serial = DispatchQueue(label: "serial", attributes: .serial)
let concurrent = DispatchQueue(label: "concurrent", attributes: .concurrent)
let q = DispatchQueue(label: "q")

我发现q上没有可以检查的属性会告诉我。

PlaygroundPage.current.needsIndefiniteExecution = true的游乐场中运行会显示连续行为,但我不想依赖于操场(有异步的东西)或无证件的行为。

任何人都可以通过文档链接提供一个简单的答案吗?

2 个答案:

答案 0 :(得分:8)

在Swift 3之前,默认的调度队列类型是dispatch_queue_create的串行 - passing nil into the attributes parameter将产生一个串行队列,我认为没有理由要更改默认队列类型。虽然遗憾的是我无法在DispatchQueue找到任何可以证实这一点的文档。

但是,looking at the source code表明情况确实如此:

public convenience init(
    label: String,
    attributes: DispatchQueueAttributes = .serial, 
    target: DispatchQueue? = nil)
{
    ...
}

虽然我总是更喜欢明确指定属性,但是为了使我的代码更清晰并防止这种混淆。

答案 1 :(得分:0)

UPD Swift 5

@Hamish的答案成立:默认情况下,一个新的DispatchQueue是串行的。 而且尽管源代码中属性的默认值不再像以前那样指定“ .serial”:

public convenience init(
        label: String,
        qos: DispatchQoS = .unspecified,
        attributes: Attributes = [],
        autoreleaseFrequency: AutoreleaseFrequency = .inherit,
        target: DispatchQueue? = nil)

值得注意的是,该属性值集具有.concurrent选项,但不再具有.serial。 同样,默认情况下为串行,如果在属性数组中明确分配,则为并发。