“DispatchQueue.Attributes”类型没有“serial”成员。

13

我已经使用Xcode8 beta4将现有的Swift2.3代码转换为Swift3.0。Xcode会自动将语法转换为Swift3.0,但它不能创建串行调度队列。

private let serialQueue = DispatchQueue(label: "identifier", qos: DispatchQoS.QoSClass.serial)

注: 将 "DispatchQueue.Attributes" 更改为 "DispatchQoS.QoSClass"。
2个回答

27

现在没有.serial属性了,但是调度队列默认是串行的,除非你指定.concurrent属性:

let serialQueue = DispatchQueue(label: "label")
let concurrentQueue = DispatchQueue(label: "label", attributes: .concurrent)

来源:如何在Xcode 8 beta 4中使用Swift 3创建串行DispatchQueue?,发布于Apple开发者论坛。


在Swift 4中运行失败。需要在属性、autoreleaseFrequency和target中指定什么?文档非常差劲。 - nr5
@nr5:它是怎么失败的?上面的代码在我的Xcode 10和Swift 4.2中仍然可以编译。 - Martin R
我想创建一个串行队列,并且只想指定qos。但是在Swift 4中,还有3个参数:attributes、frequency和target。如果我使用你的代码,我无法指定qos。我也看不懂文档:https://developer.apple.com/documentation/dispatch/dispatchqueue/2300059-init 请帮忙!也许你可以回答这个问题:https://stackoverflow.com/questions/50129528/how-to-create-a-serial-queue-in-swift4 - nr5
1
@nr5:所有参数都有默认值,所以 DispatchQueue(label: "label", qos: .background) 应该可以工作。 - Martin R
1
@nr5:所有内容都在Swift语言参考中 :) 在https://docs.swift.org/swift-book/LanguageGuide/Functions.html中查找“默认参数值”。 - Martin R
显示剩余3条评论

0
使用DispatchQueueSerial或DispatchQueueConcurrent构造函数,这样你就会得到正确的默认值。两个构造函数都不允许你请求串行或并发执行,因为这已经内置在类中。DispatchQueue将给你一些错误的默认值。

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