浅谈OC中的GCD装换成Swift语法

总结一下自己的 理解,方便以后复习。如果能够给其他学习者带来帮助,陪感荣幸!

一. GCD有两个核心概念:

  1. 队列: 用来存放任务
  2. 任务: 执行的操作事件

1.1 队列介绍:
在介绍队列前,就不得不简单先描述一下,进程、线程消息队列三者的关系,当你运行一个iOSAPP时,操作系统会将你的程序文件加载到内存中,这就生成了一个进程了;程序在启动之后已经存在主线程了,主队列则同样存在了。APP里面如果有开启新的线程,则会进行线程之间的调度(CPU运行代码指令很快,好像所有的事情都是同时执行的)。
队列本质是用于控制任务的执行方式,队列分为:串行队列和并行队列。 在这里解释一下 全局队列 和 主队列。
主队列:
程序在启动之后已经存在主线程了,主队列则同样存在,主队列属于串行队列:用于刷新 UI,任何需要刷新 UI 的工作都要在主队列执行。(iOS开发中,线程和队列可以互相穿插。)专门负责调度主线程度的任务,没有办法开辟新的线程。所以,在主队列下的任务不管是异步任务还是同步任务都不会开辟线程,任务只会在主线程顺序执行。
主队列异步任务:现将任务放在主队列中,但是不是马上执行,等到主队列中的其它所有除我们使用代码添加到主队列的任务的任务都执行完毕之后才会执行我们使用代码添加的任务。
主队列同步任务:容易阻塞主线程,所以不要这样写。原因:我们自己代码任务需要马上执行,但是主线程正在执行代码任务的方法体,因此代码任务就必须等待,而主线程又在等待代码任务的完成好去完成下面的任务,因此就形成了相互等待。整个主线程就被阻塞了。
全局队列
全局队列:本质是一个并发队列,由系统提供,方便编程,可以不用创建就直接使用。
全局队列和并发队列的区别:
1,全局队列没有名字,但是并发队列有名字。有名字可以便于查看系统日志
2,全局队列是所有应用程序共享的。
3,在mrc的时候,全局队列不用手动释放,但是并发队列需要。(这个时代已经远离我们了)

开辟队列的方法:

创建串行队列:
oc语法:
dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", NULL);
/** 参数1:标签,用于区分队列
参数2:队列的类型,表示这个队列是串行队列还是并发队列NUll表示串行队列,DISPATCH_QUEUE_CONCURRENT表示并发队列 */
swift 语法:
let queue = DispatchQueue(label: "Kenneth")
获取主队列:
oc写法:dispatch_queue_t queue = dispatch_get_main_queue();
swift写法: let mainQueue = DispatchQueue.main

创建并行队列,oc写法上面已经提到了。swift写法:
let conQueue = DispatchQueue(label: "Kenneth", attributes: .concurrent)
获取全局队列:
oc语法:dispatch_get_global_queue(long indentifier.unsigned long flags)
/**
参数说明:
参数1:代表该任务的优先级,默认写0就行,不要使用系统提供的枚举类型,因为ios7和ios8的枚举数值不一样,使用数字可以通用。
参数2:苹果保留关键字,一般也写0
/
swift语法:
DispatchQueue.global() 《==》DispatchQueue.global(qos: .default)
不指定,默认就是 default。
在 iOS >= 8 之后,优先级的概念被苹果使用 QoS 替代了,Swift 3 中也一样。我们不再使用优先级,而是使用 QoS 来描述全局队列。简单地说,这两者之间的对应关系是这样的:
Priority DispatchQoS
DISPATCH_QUEUE_PRIORITY_HIGH .userInitiated
DISPATCH_QUEUE_PRIORITY_DEFAULT .default
DISPATCH_QUEUE_PRIORITY_LOW .utility
DISPATCH_QUEUE_PRIORITY_BACKGROUND .background
/
**/
执行队列的方法
异步执行
oc写法: dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
swift写法
queue.async {
//任务代码
}:
同步执行
oc写法: dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
swift写法
queue.sync {
//任务代码
}:
延时执行
之前我们在 GCD 中,想要指派一个任务延时执行(比如等待一个动画),需要写的代码十分复杂。我们来看看 Swift 3 中是怎样的:
let delay = DispatchTime.now() + 3.5
DispatchQueue.main.asyncAfter(deadline: delay) {
// 你想做啥
}
Tips:要注意这里的单位是秒(s),如果你想更改单位的话,可以使用 DispatchTime 的 enum:
.seconds(Int)
.milliseconds(Int)
.microseconds(Int)
.nanoseconds(Int)

你可能感兴趣的:(浅谈OC中的GCD装换成Swift语法)