Actor (Swift 5.5+) vs GCD (DispatchQueue) 对比
结构化并发,编译器保证无数据竞争
VS
GCD (DispatchQueue)
传统的 Grand Central Dispatch,支持 iOS 4+
9 分钟阅读iOS
评分对比
图表加载中…
详细评分
| 分类 | Actor (Swift 5.5+) | GCD (DispatchQueue) |
|---|---|---|
| 性能 | 9/10 | 10/10 |
| 学习难易度 | 8/10 | 6/10 |
| 生态系统 | 9/10 | 8/10 |
| 社区 | 9/10 | 9/10 |
| 就业市场 | 10/10 | 7/10 |
| 面向未来 | 10/10 | 6/10 |
优缺点
Actor (Swift 5.5+)
优点
- 编译期数据竞争安全
- 原生支持 async/await
- Swift 6 严格并发模式下强制生效
- 显式的 @MainActor、@globalActor
- Nonisolated 方法支持无线程限制的读取
- Actor 跳转对开发者透明
- 兼容 Swift Testing 框架
- 调试更简单 —— 调用栈清晰可见
缺点
- 仅支持 Swift 5.5+
- Actor 隔离概念有一定学习曲线
- Sendable 一致性规则较严格
- Actor 跳转开销虽小但确实存在
最适合
新的 iOS 15+ 应用跨线程共享状态async/await 工作流对数据竞争敏感的代码(金融、安全领域)Swift 6 迁移项目
GCD (DispatchQueue)
优点
- 广泛支持 iOS 4+
- 经过 15 年以上生产环境验证
- 全局队列与自定义队列灵活搭配
- QoS 等级(userInteractive、utility、background)
- DispatchSemaphore、DispatchGroup 原语
- DispatchSourceTimer 提供细粒度控制
- 支持底层性能调优
- 与 Objective-C 互操作
缺点
- 无法在编译期捕获数据竞争
- 回调地狱 / 嵌套闭包可读性差
- 没有显式的 @MainActor —— 需手动调用 DispatchQueue.main.async
- 调试困难 —— 定位线程上下文需要借助 Instruments
- 迁移到 Swift 6 较为困难
最适合
遗留 iOS 应用(iOS 10-14)性能关键的底层任务(视频帧、音频处理)与 Objective-C 代码库互操作自定义调度需求需要 DispatchSourceTimer、信号量等场景
代码对比
Actor (Swift 5.5+)
actor UserCache {
private var cache: [String: User] = [:]
func get(id: String) -> User? {
return cache[id]
}
func set(id: String, user: User) {
cache[id] = user
}
}
// 使用方式
let cache = UserCache()
let user = await cache.get(id: "123") // actor 跳转自动完成GCD (DispatchQueue)
import Foundation
class UserCache {
private let queue = DispatchQueue(label: "cache", attributes: .concurrent)
private var cache: [String: User] = [:]
func get(id: String, completion: @escaping (User?) -> Void) {
queue.async {
completion(self.cache[id])
}
}
func set(id: String, user: User) {
queue.async(flags: .barrier) {
self.cache[id] = user
}
}
}结论
新的 Swift 5.5+ 代码应强制使用 Actor。遗留的 iOS 10-14 代码继续使用 GCD。混合方案:新模块用 Actor,旧的 GCD 代码维护并逐步迁移。Swift 6 严格并发模式将在 2026 年成为强制要求。
获取免费咨询常见问题
常见问题
Actor 跳转的开销为 10-50ns —— 微秒级别。对视频处理这类超低延迟场景仍建议用 GCD,其他场景选 Actor 更合适。