Swift 并发(Swift Concurrency)是 Swift 5.5 引入的一整套原生异步编程模型,目的是让异步编程更安全、清晰、可组合、可维护。它的核心构成包括:
✅ Swift 并发大纲一览
1. 异步函数(async
/ await
)
-
async
:声明一个异步函数(表示它可能挂起) -
await
:在调用异步函数时使用,表示等待结果
func fetchData() async -> String { ... }
let result = await fetchData()
2. 任务(Task
)与任务组
2.1 Task
:创建并发任务(子任务、后台任务等)
Task {
let result = await fetchData()
}
2.2 TaskGroup
:并发地启动多个任务,并聚合结果
await withTaskGroup(of: String.self) { group in
group.addTask { await fetchData1() }
group.addTask { await fetchData2() }
for await result in group {
print(result)
}
}
3. 结构化并发(Structured Concurrency)
- 自动追踪任务生命周期(子任务随父任务销毁)
- 由
async let
、TaskGroup
实现
async let a = fetchData1()
async let b = fetchData2()
let results = await (a, b)
4. 并发安全(Data Isolation)
Swift 提供机制防止数据竞争。
4.1 actor
:主力数据隔离工具
actor Counter {
private var value = 0
func increment() { value += 1 }
func getValue() -> Int { value }
}
4.2 MainActor:确保 UI 代码在主线程执行
@MainActor
class ViewModel {
func updateUI() { ... } // 自动切换回主线程
}
5. 取消(Task Cancellation)
任务可被取消,任务内部需检查 Task.isCancelled
。
Task {
if Task.isCancelled { return }
}
6. 异步序列(AsyncSequence
/ AsyncStream
)
用于异步数据流(类似 Combine、RxSwift)
for await item in myAsyncStream {
print(item)
}
7. DetachedTask(非结构化任务)
脱离结构化上下文执行的任务。
let task = Task.detached {
await doSomething()
}
8. Continuation(CheckedContinuation
/ UnsafeContinuation
)
桥接传统回调风格(Completion handler)与 async/await
。
func legacyFunctionAsync() async -> String {
await withCheckedContinuation { continuation in
legacyFunction { result in
continuation.resume(returning: result)
}
}
}
9. 并发属性(@Sendable
, @MainActor
, @globalActor
)
-
@Sendable
: 标记闭包可以安全跨线程执行 -
@MainActor
: 标记类/函数必须在主线程 -
@globalActor
: 自定义全局 Actor
🧠 总结关键点
特性 | 功能 |
---|---|
async/await |
异步函数调用 |
Task |
创建新的异步任务 |
TaskGroup |
并发任务组 |
actor |
数据隔离,线程安全 |
MainActor |
UI 操作的主线程保护 |
AsyncSequence |
异步数据流 |
Continuation |
兼容旧式回调 |
@Sendable |
闭包线程安全标记 |
以下是 Swift 并发(Swift Concurrency)系统的完整大纲,并包含了每个特性的 iOS 支持最低版本(即在哪个 iOS 系统版本中开始可用):
🧵 一、基本构建块(基础并发)
特性 | 简介 | 支持版本 |
---|---|---|
async / await
|
标记异步函数和等待异步结果 | ✅ iOS 13+(编译器要求 iOS 15+ 默认启用) |
Task |
用于创建并执行结构化并发的异步任务 | ✅ iOS 15+ |
Task.sleep |
异步睡眠,不阻塞线程 | ✅ iOS 15+ |
TaskGroup |
结构化并发下的并行任务组 | ✅ iOS 15+ |
async let |
并发启动多个异步任务(语法糖) | ✅ iOS 15+ |
try await |
异步错误处理语法 | ✅ iOS 15+ |
await withCheckedContinuation |
将传统回调封装为 async 异步调用 |
✅ iOS 13+(可选使用),推荐 iOS 15+ |
DetachedTask |
启动脱离当前上下文的独立任务 | ✅ iOS 15+ |
📍 二、主线程调度和隔离
特性 | 简介 | 支持版本 |
---|---|---|
@MainActor |
保证函数或类属性在主线程上执行 | ✅ iOS 15+ |
MainActor.run |
在主线程中执行异步代码块 | ✅ iOS 15+ |
@MainActor + await
|
后台线程调用时会自动调度回主线程 | ✅ iOS 15+ |
🧩 三、Actors(并发对象模型)
特性 | 简介 | 支持版本 |
---|---|---|
actor |
类似类,但保证内部状态的线程安全性 | ✅ iOS 15+ |
nonisolated |
用于标记不参与 actor 隔离的成员 | ✅ iOS 15+ |
@MainActor actor |
指定该 actor 绑定主线程执行 | ✅ iOS 15+ |
📦 四、高级功能
特性 | 简介 | 支持版本 |
---|---|---|
Sendable |
类型安全特性,用于跨线程发送数据 | ✅ iOS 15+ |
@Sendable closure |
明确声明闭包是线程安全的 | ✅ iOS 15+ |
@preconcurrency |
向后兼容旧的非并发 API 调用 | ✅ iOS 15+ |
UnstructuredTask |
不受父任务控制的异步任务 | ✅ iOS 15+ |
🧪 五、测试和调试工具
工具/概念 | 简介 |
---|---|
Xcode Concurrency Debugger | 可视化查看任务执行、actor 使用等并发信息 |
Instruments with Swift Concurrency | 分析异步任务行为与线程调度 |
📅 支持版本汇总(系统要求)
特性 | iOS 支持版本 |
---|---|
Swift Concurrency 最核心特性 | iOS 13+(部分依赖后备 polyfill 支持) |
全量支持(推荐) | ✅ iOS 15+ |
Xcode 13+ + Swift 5.5+ | 并发语法正式启用 |
⚠️ 注意:虽然
async/await
在 iOS 13+ 可运行(通过 back-deployment),但你需要使用 Xcode 13+ 并明确在构建设置中启用支持(Deployment Target ≥ iOS 13,勾选 “Enable Back Deployment of Concurrency”)。