作者:mobiledu2502896807 | 来源:互联网 | 2024-12-02 12:49
自Swift3.0以来,GrandCentralDispatch(GCD)的使用方式有了显著的变化,变得更加简洁高效。本文将介绍GCD的核心概念,包括队列、同步与异步操作、服务质量(QoS)以及常见的使用场景。
自 Swift 3.0 以来,Grand Central Dispatch (GCD) 的使用方式更加简洁高效。本文将详细介绍 GCD 的核心概念及其应用。
队列
GCD 使用队列来管理任务的执行。主要分为两种类型:
- 并发队列:允许多个任务同时执行,自动开启多个线程。并发功能仅在异步函数中有效。
- 串行队列:任务按顺序执行,一个任务完成后才会执行下一个任务。
同步与异步的区别
- 同步:任务在当前线程中执行,不会开启新线程。
- 异步:任务在新的线程中执行,可以开启新线程。
服务质量 (QoS)
QoS 用于指定任务的优先级,从高到低依次为:
- userInteractive
- userInitiated
- default
- utility
- background
- unspecified
GCD 线程队列的创建方法
以下是几种常见的 GCD 队列创建方法:
- 创建一个串行队列:
let serialQueue = DispatchQueue(label: "Mazy", attributes: .init(rawValue: 0))
- 创建一个并发队列:
let cOnQueue= DispatchQueue(label: "Mazy", attributes: .concurrent)
- 获取全局并发队列:
let globalQueue = DispatchQueue.global()
- 获取主队列:
let mainQueue = DispatchQueue.main
同步/异步 + 串行/并发队列的组合
通过不同的组合,可以实现各种复杂的任务调度:
GCD 的其他使用
除了基本的任务调度,GCD 还支持延迟执行和其他高级功能:
- 延迟执行:
print("开始执行 \(NSDate())")
let additionalTime: DispatchTimeInterval = .seconds(3)
DispatchQueue.main.asyncAfter(deadline: .now() + additionalTime, execute: {
print("3秒后执行 \(NSDate())")
})
- 其他延迟执行方法:
// 方法 1
perform(#selector(demo), with: nil, afterDelay: 3.0)
// 方法 2
Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false, block: {_ in
print("延迟3s执行")
})
- 创建线程群组:
func group() {
// 获得全局队列
let globalQueue = DispatchQueue.global()
// 创建一个队列组
let group = DispatchGroup()
globalQueue.async(group: group, execute: { print("任务一 \(Thread.current)") })
globalQueue.async(group: group, execute: { print("任务二 \(Thread.current)") })
// 群组内的任务完成后,执行此方法
group.notify(queue: globalQueue, execute: { print("终极任务 \(Thread.current)") })
globalQueue.async(group: group, execute: { print("任务三 \(Thread.current)") })
globalQueue.async(group: group, execute: { print("任务四 \(Thread.current)") })
}
注意事项
使用 sync 同步函数往当前串行队列中添加任务会卡住当前的串行队列。