如何在Swift 3中创建调度队列

在Swift 2中,我能够用以下代码创建队列:

let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)

但是这不能在Swift 3中编译。

在Swift 3中,首选的方式是什么?

369085 次浏览

创建并发队列

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`
}

如果你想了解如何使用这些队列。请参阅这个回答

在>=斯威夫特3下编译。这个例子包含了我们需要的大部分语法。

QoS——新的服务质量语法

weak self -中断保留周期

如果self不可用,什么都不做

async global utility queue -用于网络查询,不等待结果,它是一个并发队列,块(通常)在启动时不等待。并发队列的例外可能是,当它的任务限制已经达到时,队列临时变成一个串行队列并等待,直到该队列中的某个先前的任务完成。

async main queue -对于触摸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
}
}
}
}

现在很简单:

let serialQueue = DispatchQueue(label: "my serial queue")

默认值是serial,要获得concurrent,可以使用可选属性参数.concurrent

编译在XCode 8, Swift 3 https://github.com/rpthomas/Jedisware < / p >

 @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 3.0中使用这段代码创建调度队列

DispatchQueue.main.async
{
/*Write your code here*/
}


/* or */


let delayTime = DispatchTime.now() + Double(Int64(0.5 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: delayTime)
{
/*Write your code here*/
}

我这样做了,如果你想在不被用户注意的情况下刷新你的UI来显示新数据,比如UITableView或UIPickerView,这就特别重要。

    DispatchQueue.main.async
{
/*Write your thread code here*/
}
   let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) //Swift 2 version


let concurrentQueue = DispatchQueue(label:"com.swift3.imageQueue", attributes: .concurrent) //Swift 3 version

我在Xcode 8, Swift 3中重做了你的代码,这些变化与你的Swift 2版本形成对比。

DispatchQueue.main.async(execute: {


// write code


})

串行队列:

let serial = DispatchQueue(label: "Queuename")


serial.sync {


//Code Here


}

并发队列:

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


concurrent.sync {


//Code Here
}
 DispatchQueue.main.async {
self.collectionView?.reloadData() // Depends if you were populating a collection view or table view
}




OperationQueue.main.addOperation {
self.lblGenre.text = self.movGenre
}

//使用操作队列如果你需要填充对象(标签,imageview, textview)在你的视图控制器

DispatchQueue.main.async(execute: {
// code
})

斯威夫特3

你想在swift代码中调用一些闭包然后你想在storyboard中改变任何类型的改变属于视图,你的应用程序会崩溃

但是你要使用分派方法,你的应用程序不会崩溃

异步方法

DispatchQueue.main.async
{
//Write code here


}

同步方法

DispatchQueue.main.sync
{
//Write code here


}

Swift 3

   DispatchQueue.main.async {
// Write your code here
}
 let newQueue = DispatchQueue(label: "newname")
newQueue.sync {


// your code


}

由于OP问题已经在上面得到了回答,我只想添加一些速度方面的考虑:

DispatchQueue.global中为async函数分配的优先级类有很大的不同。

我不建议使用.background线程优先级运行任务,特别是在iPhone X上,因为任务似乎分配在低功耗内核上。

下面是一个计算密集型函数的一些真实数据,该函数从XML文件中读取(带缓冲)并执行数据插值:

设备名称/ .background / .utility / .default / .userInitiated / .userInteractive

  1. iPhone X: 18.7s / 6.3s / 1.8s / 1.8s
  2. iPhone 7: 4.6s / 3.1s / 3.0s / 2.8s / 2.6s
  3. iPhone 5s: 7.3s / 6.1s / 4.0s / 4.0s / 3.8s

注意,并不是所有设备的数据集都相同。iPhone X最大,iPhone 5s最小。

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。AutoreleaseFrequency

目标

执行块的目标队列。如果希望系统提供适合当前对象的队列,则指定DISPATCH_TARGET_QUEUE_DEFAULT。