Swift 3.0 【Swift 3.0 中 GCD 的改变】

12 篇文章 3 订阅

DispatchQueue


首先,dispatch 的全局函数不再写为下划线风格的名称了,它变成了一个更符合 Swift 风格的 DispatchQueue 的样子。


main thread


同样的,你不需要在去用 dispatch_get_main_queue ( ) 来获取主线程,而是 DispatchQueue .main,那么要放到主线程的代码怎么执行呢?只需要在线程后边使用.async{ } 即可,也就是说,大概是这样:

DispatchQueue.main.async { 
      print(Thread.current)
}


优先级


说完了最基本的东西,我们再来说说其他改变了的东西,比如优先级的名字。

我们知道,GCD 的默认队列优先级有四个:

  • DISPATCH_QUEUE_PRIORITY_HIGH
  • DISPATCH_QUEUE_PRIORITY_DEFAULT
  • DISPATCH_QUEUE_PRIORITY_LOW
  • DISPATCH_QUEUE_PRIORITY_BACKGROUND

现在,新的语法当中,改变了这四个不明不白的优先级名称为更有意义的名字:

  • .userInitialted
  • .default
  • .utility
  • .background

当然,它们的对应关系也就是与顺序相同的:

 DISPATCH_QUEUE_PRIORITY_HIGH:        .userInitiated
 DISPATCH_QUEUE_PRIORITY_DEFAULT:     .default
 DISPATCH_QUEUE_PRIORITY_LOW:         .utility
 DISPATCH_QUEUE_PRIORITY_BACKGROUND:  .background


获取一个队列


我们使用 DispatchQueue.global ( ) 获取一个系统的队列(系统自带的全局并发队列),这样的话获取的就是默认 .default优先级的队列了,如果要获取其他优先级的队列,就使用DispatchQueue.global(qos:.userInitiated),最后,我们使用 . async{} 来执行代码:

DispatchQueue.global(qos: .userInitiated).async {
    print(Thread.current)
}


创建一个队列


直接用 DispatchQueue 的初始化器来创建一个队列。最简单直接的办法是这样:

let queue = DispatchQueue(label: "myBackgroundQueue")


复杂一点?你可以指定优先级以及队列类别:

let queue = DispatchQueue(label: "myBackgroundQueue", qos: .userInitiated, attributes: .concurrent)


然后把代码放进去即可:

queue.async {
    print("aaa")
}


队列组


对于组,现在你可以使用这样的语法直接创建一个组:

let group = DispatchGroup()


至于使用,则是这样的:

let group = DispatchGroup()
 
let queue = DispatchQueue(label: "myBackgroundQueue")
 
queue.async(group:group) {
    print("background working")
}


那么,如果有多个并发队列在同一个组里,我们需要它们完成了再继续呢?

group.wait()


指定时间后执行


很多时候你可能还需要让一些代码在指定的时间后执行,比如动画完成后。这个任务在swift 2.3 很麻烦,不过,在3.0就不一样了:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3.0) {
    print("after!")
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值