在Swift 2中,我能够用以下代码创建队列:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
但是这不能在Swift 3中编译。
在Swift 3中,首选的方式是什么?
在Swift 2中,我能够用以下代码创建队列:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
但是这不能在Swift 3中编译。
在Swift 3中,首选的方式是什么?
当前回答
Swift 3
DispatchQueue.main.async {
// Write your code here
}
其他回答
创建并发队列
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {
}
创建一个串行队列
let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync {
}
异步获取主队列
DispatchQueue.main.async {
}
同步获取主队列
DispatchQueue.main.sync {
}
获取一个背景线程
DispatchQueue.global(qos: .background).async {
}
Xcode 8.2 beta 2:
获取一个背景线程
DispatchQueue.global(qos: .default).async {
}
DispatchQueue.global().async {
// qos' default value is ´DispatchQoS.QoSClass.default`
}
如果你想了解如何使用这些队列。请看这个答案
在>=Swift 3下编译。这个例子包含了我们需要的大部分语法。
QoS——新的服务质量语法
弱自中断保留周期
如果self不可用,什么都不做
Async全局实用程序队列——用于网络查询,不等待结果,它是一个并发队列,块(通常)在启动时不等待。并发队列的例外可能是,当它的任务限制已经达到时,队列临时变成一个串行队列并等待,直到该队列中的某个先前的任务完成。
async主队列——对于触摸UI,块不等待结果,而是等待它在开始时的槽。主队列是一个串行队列。
当然,你需要添加一些错误检查…
DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in
guard let strongSelf = self else { return }
strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in
if error != nil {
print("error:\(error)")
} else {
DispatchQueue.main.async { () -> Void in
activityIndicator.removeFromSuperview()
strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage
}
}
}
}
我这样做了,如果你想在不被用户注意的情况下刷新你的UI来显示新数据,比如UITableView或UIPickerView,这就特别重要。
DispatchQueue.main.async
{
/*Write your thread code here*/
}
在XCode 8编译,Swift 3 https://github.com/rpthomas/Jedisware
@IBAction func tap(_ sender: AnyObject) {
let thisEmail = "emailaddress.com"
let thisPassword = "myPassword"
DispatchQueue.global(qos: .background).async {
// Validate user input
let result = self.validate(thisEmail, password: thisPassword)
// Go back to the main thread to update the UI
DispatchQueue.main.async {
if !result
{
self.displayFailureAlert()
}
}
}
}
swift 5更新
串行队列
let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
// code to execute
}
并发队列
let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
concurrentQueue.async {
// code to execute
}
来自苹果文档:
参数
标签
附加到队列上的字符串标签,以便在诸如Instruments、sample、stackshots和崩溃报告等调试工具中惟一地标识队列。因为应用程序、库和框架都可以创建自己的分派队列,所以建议使用反向dns命名风格(com.example.myqueue)。该参数为可选参数,可以为NULL。
qos
与队列关联的服务质量级别。该值决定了系统调度任务执行的优先级。有关可能值的列表,请参见DispatchQoS.QoSClass。
属性
要与队列关联的属性。包含concurrent属性以创建并发执行任务的调度队列。如果忽略该属性,分派队列将按顺序执行任务。
autoreleaseFrequency
自动释放由队列调度的块创建的对象的频率。有关可能值的列表,请参见dispatchqueue . autoreleasfrequency。
目标
执行块的目标队列。如果希望系统提供适合当前对象的队列,则指定DISPATCH_TARGET_QUEUE_DEFAULT。