多线程编程新思路:GCD概览
GCD
- 任务 + 队列
- 易用
- 效率
- 性能
image-20230308205145335.png
- 创建管理Queue
- 提交Job
- Dispatch group
- 管理Dispatch Object
- 信号量Semaphore
- 队列屏障Barrier
- Dispatch Source
- Queue Context数据
- Dispatch I/O Channel
- Dispatch Data对象
GCD-队列
- 主队列:任务在主线程执行
- 并行队列:任务会以先进先出的顺序入列和出列,但是因为多个任务可以并行执行,所以完成顺序是不一定的
- 串行队列:任务会以先进先出的顺序入列和出列,但是同一时刻只会执行一个任务
GCD-队列API
- Dispatch.main
- Dispatch.global
- DispatchQueue(label:, qos:, attributes:, autoreleaseFrequency:, target:)
- queue.label
- setTarget(queue: DispatchQueue?)
GCD-队列
image-20230308210224437.png- 最终的目标队列都是主队列和全局队列
- 如果把一个并行队列的目标队列设置为一个串行队列,那么并行队列将不再并行
- 如果多个队列的目标队列都设置为同一个串行队列,那么这多个队列连同目标队列里的任务都将串行执行
- 如果设置目标队列形成环了,结果是不可预期的
- 如果在一个队列正在执行任务的时候更换目标队列,结果也是不可预期的
如何使用GCD:基本操作指南
GCD-基本操作
- sync
- async
- asyncAfter
GCD-串行 vs 并行
image-20230308211127695.pngGCD-同步 vs 异步
image-20230308211215763.pngGCD-sync
- 提交任务到当前队列里,并且直到任务执行完成,当前队列才会返回。
GCD-async
- 调度一个任务去立即执行,但是不用等任务执行完当前队列就会返回
GCD-asyncAfter
- 调度一个任务去多久之后执行,但是不用等任务执行完当前队列就会返回
//qos:优先级/服务质量
//attributes: 指定队列是并行的还是串行的
//autoreleaseFrequency: 频度
//target: 指向哪种队列, 不设置就指向默认
let queue = DispatchQueue(label: "myQueue", qos:DispatchQos.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
queue.sync {
print("in queue sync")
}
queue.async {
sleep(1)
print("in queue async")
}
//deadline: 什么时候去执行 now代表立即执行
queue.asyncAfter(deadline: .now() + 1) {
print("in asyncAfter")
}
print("after invoke queue method")
深度使用GCD:高级特性指南
DispatchGroup
image-20230311215232022.pngDispatchGroup - wait
image-20230311215600533.pngDispatchGroup - notify
image-20230311215846452.pngDispatchSource
- 简单来说,dispatch source是一个监视某些类型事件的对象。当这些事发生时,它自动将一个task放入一个dispatch queue的执行例程中
- Mach port send right state changes
- Mach port receive right state changes
- External process state change
- File descriptor ready for read
- File descriptor ready for write
- Filesystem node event
- POSIX signal
- Custom timer
- Custom event
网友评论