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("延迟加入队列")
}

 

posted @ 2022-08-26 17:36  ~道一~  阅读(97)  评论(0编辑  收藏  举报