@H_404_4@
首先,dispatch 的全局函数不再写为下划线风格的名称了,它变成了一个更符合 Swift 风格的 dispatchQueue 的样子。@H_404_4@
main thread
@H_404_4@
同样的,你不需要在去用 dispatch_get_main_queue ( ) 来获取主线程,而是 dispatchQueue .main,那么要放到主线程的代码怎么执行呢?只需要在线程后边使用 .async{ } 即可,也就是说,大概是这样: @H_404_4@
dispatchQueue.main.async { print(Thread.current)}
优先级
@H_404_4@
说完了最基本的东西,我们再来说说其他改变了的东西,比如优先级的名字。@H_404_4@
我们知道,GCD 的默认队列优先级有四个:@H_404_4@ disPATCH_QUEUE_PRIORITY_HIGH disPATCH_QUEUE_PRIORITY_DEFAulT disPATCH_QUEUE_PRIORITY_LOW disPATCH_QUEUE_PRIORITY_BACKGROUND
现在,新的语法当中,改变了这四个不明不白的优先级名称为更有意义的名字:@H_404_4@ .userInitialted .default .utility .background
当然,它们的对应关系也就是与顺序相同的:@H_404_4@
disPATCH_QUEUE_PRIORITY_HIGH:.userInitiated disPATCH_QUEUE_PRIORITY_DEFAulT: .default disPATCH_QUEUE_PRIORITY_LOW: .utility disPATCH_QUEUE_PRIORITY_BACKGROUND:.background
获取一个队列
@H_404_4@
我们使用 dispatchQueue.global ( ) 获取一个系统的队列(系统自带的全局并发队列),这样的话获取的就是默认 .default优先级的队列了,如果要获取其他优先级的队列,就使用dispatchQueue.global(qos: .userInitiated),最后,我们使用 . async{} 来执行代码: @H_404_4@
dispatchQueue.global(qos: .userInitiated).async { print(Thread.current)}
创建一个队列
@H_404_4@
直接用 dispatchQueue 的初始化器来创建一个队列。最简单直接的办法是这样:@H_404_4@
let queue = dispatchQueue(label: "myBackgroundQueue")
@H_404_4@
复杂一点?你可以指定优先级以及队列类别:@H_404_4@
let queue = dispatchQueue(label: "myBackgroundQueue",qos: .userInitiated,attributes: .concurrent)
@H_404_4@
然后把代码放进去即可:@H_404_4@
queue.async {print("aaa")}
队列组
@H_404_4@
对于组,现在你可以使用这样的语法直接创建一个组:@H_404_4@
let group = dispatchGroup()
@H_404_4@
至于使用,则是这样的:@H_404_4@
let group = dispatchGroup()let queue = dispatchQueue(label: "myBackgroundQueue")queue.async(group:group) {print("background working")}
@H_404_4@
那么,如果有多个并发队列在同一个组里,我们需要它们完成了再继续呢?@H_404_4@
group.wait()
指定时间后执行
@H_404_4@
很多时候你可能还需要让一些代码在指定的时间后执行,比如动画完成后。这个任务在swift 2.3 很麻烦,不过,在3.0就不一样了:@H_404_4@
dispatchQueue.main.asyncAfter(deadline: dispatchTime.Now() + 3.0) {print("after!")}总结
以上是内存溢出为你收集整理的Swift_3.0 【Swift 3.0 中 GCD 的改变】全部内容,希望文章能够帮你解决Swift_3.0 【Swift 3.0 中 GCD 的改变】所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)