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:监听自定义事件的调度源。