Swift - GCD
背景知识
- GCD中程序执行的操作被看成任务,例如一个函数的执行就可以被看做一个任务;
- GCD中,多线程的操作更多的基于队列的执行。所以,在GCD中,线程间的死锁,就是队列的彼此等待;
串行队列
let serialQueue = DispatchQueue(label: "com.test.serail")
并发队列
let concurrentQueue = DispatchQueue(label: "com.test.consurrent", qos: .default, attributes: .concurrent)
主队列
主队列是系统创建的串行队列,主要用来操作UI的。
let mainQueue = DispatchQueue.main
全局并发队列
let globalQueue = DispatchQueue.global() // 默认 default
/**
.userInteractive 需要用户交互的, 优先级最高, 和主线程一样
.userInitiated 即将需要, 用户期望优先级, 优先级高比较高
.default 默认优先级
.utility 需要执行一段时间后, 再通知用户, 优先级低
.background 后台执行的, 优先级比较低
.unspecified 不指定优先级, 最低
*/
let qosQueue = DispatchQueue.global(qos: .userInteractive)
同步执行
queue.sync
同步执行队列,只会在当前线程执行任务,不会开启新线程;
异步执行
queue.async
异步执行队列,会开启新线程执行任务;
栅栏任务
通俗说,就是可以指定在异步并发队列中的某个位置执行栅栏任务
// 并发队列
let concurrentQueue = DispatchQueue(label: "com.test.consurrent", qos: .default, attributes: .concurrent)
let task = DispatchWorkItem(flags: .barrier) {
print("我就是一个栅栏,你看到了嘛")
}
for item in 0...19 {
if item == 9 {
concurrentQueue.async(execute: task)
}
concurrentQueue.async {
print(item)
}
}
打印结果:
2
5
4
0
3
1
6
7
8
我就是一个栅栏,你看到了嘛
10
9
15
17
13
14
11
16
18
19
12
迭代任务
类似于快速分发,类似于OC中dispatch_apply
// 并发队列
let concurrentQueue = DispatchQueue(label: "com.test.consurrent", qos: .default, attributes: .concurrent)
concurrentQueue.async {
print("00000")
DispatchQueue.concurrentPerform(iterations: 10) { index in
print(index)
}
print("22222")
}
打印结果:
00000
0
8
9
1
4
6
7
5
3
2
22222
任务组
任务组DispatchGroup
主要用于任务执行完后,会发送出已经完成的通知group.notify
,该通知也是异步执行
// 并发队列
let concurrentQueue = DispatchQueue(label: "com.test.consurrent", qos: .default, attributes: .concurrent)
// 任务组
let group = DispatchGroup()
print("dispatchGroup测试开始")
concurrentQueue.async(group: group) {
print("000")
}
concurrentQueue.async(group: group) {
print("111")
}
concurrentQueue.async(group: group) {
print("222")
}
concurrentQueue.async(group: group) {
print("333")
}
// queue 任务组完成后执行任务的线程
// group.notify的执行任务也是异步的
group.notify(queue: DispatchQueue.main) {
print("group组结束")
}
concurrentQueue.async(group: group) {
print("444")
}
concurrentQueue.async(group: group) {
print("555")
}
print("dispatchGroup测试结束")
延迟加入队列
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
print("延迟加入队列")
}
此文章为个人笔记,方便自己以及有需要的朋友查看,转载请注明出处!