这就是问题,直截了当。
let serial = DispatchQueue(label: "serial", attributes: .serial)
let concurrent = DispatchQueue(label: "concurrent", attributes: .concurrent)
let q = DispatchQueue(label: "q")
我发现q
上没有可以检查的属性会告诉我。
在PlaygroundPage.current.needsIndefiniteExecution = true
的游乐场中运行会显示连续行为,但我不想依赖于操场(有异步的东西)或无证件的行为。
任何人都可以通过文档链接提供一个简单的答案吗?
答案 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
。
同样,默认情况下为串行,如果在属性数组中明确分配,则为并发。