Swift 3 记录GCD

DispatchQueue

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

main thread

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

DispatchQueue.main.async { [weakself]inyourcoderunsin mainthread}

而实际上,现在的 Xcode 的自动补全,是错误的.asynchronously()。

另:在目前的所有测试中,我发现所有写在这个闭包里的代码都不会被执行——求帮助求解答,如果这是个bug……我的所有项目还是继续使用 Swift 2.3 好了。

优先级

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

我们知道,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:        .userInitiatedDISPATCH_QUEUE_PRIORITY_DEFAULT:      .defaultDISPATCH_QUEUE_PRIORITY_LOW:          .utilityDISPATCH_QUEUE_PRIORITY_BACKGROUND:  .background

获取一个队列

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

DispatchQueue.global(qos: .userInitiated).async{//your code here}

创建一个队列

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

let queue = DispatchQueue(label:"myBackgroundQueue")

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

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

然后把代码放进去即可:

queue.async{print("aaa")}

队列打组

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

letgroup= DispatchGroup()

至于使用,则是这样的:

letgroup= DispatchGroup()letqueue = 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!")}

你可能感兴趣的:(Swift 3 记录GCD)