1、GCD(Grand Central Dispatch)
⚠️:不要在主线程中执行同步Swiftync操作,回产生死锁
优点:
- 易用:比thread更简单
- 效率:轻量,比消耗资源的线程更实用快捷
- 性能:根据系统负载自动增减线程数量,减少了上下文切换
- 安全:无须加锁和其他同步机制
同步和异步:
- 同步
sync
:只能在当前线程中执行任务,不能开启新的线程 - 异步
async
:可以在新的线程中执行任务,可以开启新的线程
异步回主线程:
1 | DispatchQueue.global().async { |
2、DispatchQueue
FIFO队列,背后是一个由系统管理的线程池
1 | let queue = DispatchQueue( |
串行和并行
1 | /* |
1 | // 读数据 |
串行
1 | func serial() { |
并行
1 | func concurrent() { |
异步与同步
同步 (sync)
提交一段任务到队列,并且阻塞当前线程,任务结束后当前线程继续执行
1 | func sync() { |
异步(async)
提交一段任务到队列,并且立刻返回
1 | func async() { |
asyncAfter 延迟执行
1 | queue.async(group: group, qos: .default, flags: []) { |
DispatchQoS (quality of service) 服务质量
任务的服务质量或执行优先级
background
:最低优先级,等同于DISPATCH_QUEUE_PRIORITY_BACKGROUND
. 用户不可见,比如:在后台存储大量数据utility
:优先级等同于DISPATCH_QUEUE_PRIORITY_LOW
,可以执行很长时间,再通知用户结果。比如:下载一个大文件,网络,计算default
:默认优先级,优先级等同于DISPATCH_QUEUE_PRIORITY_DEFAULT
,建议大多数情况下使用默认优先级userInitiated
:优先级等同于DISPATCH_QUEUE_PRIORITY_HIGH
,需要立刻的结果userInteractive
:用户交互相关,为了好的用户体验,任务需要立马执行。使用该优先级用于 UI 更新,事件处理和小工作量任务,在主线程执行
1 | DispatchQueue.global().async(qos: .background) { |
DispatchWorkItem
把任务封装为一个对象
1 | let item = DispatchWorkItem { |
也可指定更多参数:
1 | DispatchWorkItem(qos: .userInitiated, flags: [.assignCurrentContext,.barrier]) { |
DispatchWorkItemFlags
指定任务的额外信息
1 | public static let barrier: |
Barrier 屏障
1 | func barrier() { |
1 | // 保证写入时,不能读数据 |
DispatchGroup
管理一组任务的执行,然后监听任务的完成,进而执行后续操作
notify
等group中的任务完成后,执行后续任务
1 | func groupNotify() { |
wait
等一段时间之后,不管任务有没有完成,都继续执行后续任务
1 | func groupWait() { |
enter 和 leave
group.enter()
表示一个任务被加入到group中,此时group中任务的引用计数会加1
group.leave()
表示group中的一个任务完成,引用计数减1当引用计数为0时,回通知
notify
函数
1 | func enterLeaveGroup() { |
3、DispatchSemaphore 信号量
当信号计数大于0时,每条进来的线程使计数减1,直到变为0,变为0后其他的线程将进不来,处于等待状态;
执行完任务的线程释放信号,使计数加1
1 | func semaphore() { |
Suspend 和 Resume
Suspend
可以挂起一个线程,即暂停线程,但是仍然暂用资源,只是不执行Resume
回复线程,即继续执行挂起的线程。
循环执行任务 concurrentPerform
1 | // 并发执行5次 |
DispatchSource
处理特定的系统底层事件,当一些特定的系统底层事件发生时,调度源会捕捉到这些事件,然后可以做相应的逻辑处理。
- Timer Dispatch Source:定时调度源。
- Signal Dispatch Source:监听UNIX信号调度源,比如监听代表挂起指令的SIGSTOP信号。
- Descriptor Dispatch Source:监听文件相关操作和Socket相关操作的调度源。
- Process Dispatch Source:监听进程相关状态的调度源。
- Mach port Dispatch Source:监听Mach相关事件的调度源。
- Custom Dispatch Source:监听自定义事件的调度源。