Article / 2026/05/29

DispatchQueue API

DispatchQueue 是 GCD(Grand Central Dispatch)的核心,用于在多核处理器上执行并发任务。以下是对其 API 的全面介绍及使用示例。

🚀 DispatchQueue API 全面指南

DispatchQueue 是 GCD(Grand Central Dispatch)的核心,用于在多核处理器上执行并发任务。以下是对其 API 的全面介绍及使用示例。


1. 创建队列

let serialQueue = DispatchQueue(label: "com.example.serial")
let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)

示例输出:队列本身不产生输出,需结合 async/sync 执行任务才会看到结果。


2. 同步执行 sync

let queue = DispatchQueue(label: "com.example.sync")
queue.sync {
    print("同步任务")
}
print("任务结束")

输出:

同步任务
任务结束

3. 异步执行 async

let queue = DispatchQueue(label: "com.example.async")
queue.async {
    print("异步任务")
}
print("主线程继续")

可能输出:

主线程继续
异步任务

4. 主队列

DispatchQueue.main.async {
    print("更新 UI")
}

输出:在主线程中执行 “更新 UI”,通常在界面更新中看到效果。


5. 全局队列

DispatchQueue.global().async {
    print("后台任务")
}

输出:

后台任务

6. 延迟执行 asyncAfter

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    print("2 秒后执行")
}

输出(延迟 2 秒):

2 秒后执行

7. QoS(Quality of Service)

let queue = DispatchQueue(label: "com.qos", qos: .utility)
queue.async {
    print("Utility 优先级任务")
}

输出:

Utility 优先级任务

8. Barrier 执行

let queue = DispatchQueue(label: "com.barrier", attributes: .concurrent)

queue.async {
    print("任务 1")
}
queue.async(flags: .barrier) {
    print("Barrier 写操作")
}
queue.async {
    print("任务 2")
}

输出示例:

任务 1
Barrier 写操作
任务 2

9. DispatchGroup

let group = DispatchGroup()
let queue = DispatchQueue.global()

group.enter()
queue.async {
    print("任务 A")
    group.leave()
}

group.enter()
queue.async {
    print("任务 B")
    group.leave()
}

group.notify(queue: .main) {
    print("全部完成")
}

输出(顺序不固定):

任务 A
任务 B
全部完成

10. DispatchWorkItem

let work = DispatchWorkItem {
    print("任务块执行")
}

DispatchQueue.global().async(execute: work)

输出:

任务块执行

11. 设置特定数据:setSpecific / getSpecific

let key = DispatchSpecificKey<String>()
let queue = DispatchQueue(label: "com.specific")
queue.setSpecific(key: key, value: "custom")

queue.async {
    if let val = DispatchQueue.getSpecific(key: key) {
        print("当前是自定义队列: \(val)")
    }
}

输出:

当前是自定义队列: custom

12. autoreleaseFrequency

let queue = DispatchQueue(label: "com.example.auto", autoreleaseFrequency: .workItem)
queue.async {
    print("有自动释放池包裹")
}

输出:

有自动释放池包裹

13. 设置 target 队列

let target = DispatchQueue(label: "target")
let queue = DispatchQueue(label: "child")
queue.setTarget(queue: target)
queue.async {
    print("重定向到 target")
}

输出:

重定向到 target

14. 激活 / 挂起 / 恢复

let inactiveQueue = DispatchQueue(label: "inactive", attributes: [.concurrent, .initiallyInactive])

inactiveQueue.async {
    print("延迟启动的任务")
}

inactiveQueue.activate()

输出:

延迟启动的任务

15. 并发 vs 串行总结

队列类型同步 (sync)异步 (async)是否并发
主队列✅ 阻塞✅ 不阻塞
串行队列✅ 顺序执行✅ 顺序执行
并发队列✅ 顺序执行✅ 可并发

使用 GCD 时需谨慎线程同步,避免死锁。

Giscus 未启用:请在 src/site.config.ts 中配置 repoId 与 categoryId。