多线程编程新思路:GCD概览
GCD
- 任务 + 队列
- 易用
- 效率
- 性能
- 创建管理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-队列
- 最终的目标队列都是主队列和全局队列
- 如果把一个并行队列的目标队列设置为一个串行队列,那么并行队列将不再并行
- 如果多个队列的目标队列都设置为同一个串行队列,那么这多个队列连同目标队列里的任务都将串行执行
- 如果设置目标队列形成环了,结果是不可预期的
- 如果在一个队列正在执行任务的时候更换目标队列,结果也是不可预期的
如何使用GCD:基本操作指南
GCD-基本操作
- sync
- async
- asyncAfter
GCD-串行 vs 并行
GCD-同步 vs 异步
GCD-sync
- 提交任务到当前队列里,并且直到任务执行完成,当前队列才会返回。
GCD-async
- 调度一个任务去立即执行,但是不用等任务执行完当前队列就会返回
GCD-asyncAfter
- 调度一个任务去多久之后执行,但是不用等任务执行完当前队列就会返回
//qos:优先级/服务质量//attributes: 指定队列是并行的还是串行的//autoreleaseFrequency: 频度//target: 指向哪种队列, 不设置就指向默认letqueue=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
DispatchGroup - wait
DispatchGroup - notify
DispatchSource
- 简单来说,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
DispatchSource - Time
深入理解GCD: 源码剖析
GCD - sync