1️⃣ 核心结论
Swift Concurrency 提供 结构化并发、协作式取消、Actor 数据隔离和 async/await 可组合性,比 OperationQueue 更安全、更现代。
协作模式主要是 在现有 OperationQueue 里包装 Task 或通过 Operation 执行 async 函数。
局限在于 OperationQueue 不天然支持 async/await 或结构化父子任务关系,需要手动桥接。
一句话总结:Swift Concurrency 更安全、可组合、结构化,OperationQueue 更灵活兼容旧代码,但异步集成需额外适配。
2️⃣ 协作模式
① 在 Operation 执行 async 函数
class AsyncOperation: Operation {
private let taskBlock: () async -> Void
init(taskBlock: @escaping () async -> Void) {
self.taskBlock = taskBlock
super.init()
}
override func main() {
Task {
await taskBlock()
self.completeOperation() // 自定义方法标记 Operation 完成
}
}
}
- OperationQueue 可以调度 包装 Task 的 Operation
- async/await 在 Task 内部执行
- 结构化并发仍可以在 Task 内使用 TaskGroup / async let
② 从 async/await 调用 OperationQueue
func runLegacyOperations() async {
await Task.detached {
let opQueue = OperationQueue()
let op = BlockOperation {
print("Legacy work")
}
opQueue.addOperation(op)
opQueue.waitUntilAllOperationsAreFinished() // 阻塞当前线程
}.value
}
- Task.detached 在后台线程执行
- 避免阻塞 MainActor /主线程
- 异步任务与传统 OperationQueue 协作执行
3️⃣ Swift Concurrency 的优势
| 特性 | Swift Concurrency | OperationQueue |
|---|---|---|
| 结构化并发 | ✅ 父任务自动管理子任务生命周期 | ❌ 手动管理依赖关系 |
| 任务取消 | ✅ 父任务取消 → 子任务自动 propagate | ❌ 需手动检查 isCancelled |
| 线程安全 | ✅ Actor / MainActor 隔离 | ❌ 需手动加锁 |
| 组合异步操作 | ✅ async let, TaskGroup, AsyncSequence | ❌ 依赖依赖关系 / 回调 |
| 语法易读性 | ✅ for await / async 函数 | ❌ BlockOperation / 回调嵌套 |
| UI 更新安全 | ✅ MainActor | ❌ 必须手动 DispatchQueue.main.async |
4️⃣ 局限与挑战
-
OperationQueue 不天然支持 async/await
- 需要手动包装 Task 或用 semaphore/等待
-
无法自动继承 Task 取消
- Operation 需要检查
isCancelled
- Operation 需要检查
-
依赖关系管理复杂
- TaskGroup 父子关系自动管理,OperationQueue 需手动 addDependency
-
旧代码迁移成本
- 现有大量 OperationQueue 代码,需要封装桥接 Task 才能使用 async/await 优势
5️⃣ 协作建议
- 桥接模式:用自定义 AsyncOperation 包装 async 函数
- 后台线程执行:Task.detached + OperationQueue
- MainActor UI 更新:async 函数内
await MainActor.run {} - 逐步迁移:老 OperationQueue → 新 Swift Concurrency Task / TaskGroup
6️⃣ 面试必背总结
- Swift Concurrency 提供结构化并发、协作式取消、Actor 数据隔离、async/await 可组合性。
- OperationQueue 灵活、兼容旧代码,但 async 集成需手动桥接,取消和依赖关系需自己管理。
- 协作模式主要是 在 Operation 内包装 Task 或 Task 内调用 OperationQueue。
- 优势:安全、可组合、易读、自动管理生命周期;局限:旧 API 集成成本高,不能自动继承取消。