[ PROMPT_NODE_25532 ]
swiftui-concurrency-tour-wwdc
[ SKILL_DOCUMENTATION ]
# SwiftUI 并发之旅 (摘要)
上下文:专注于 SwiftUI 的并发概览,涵盖 Actor 隔离、Sendable 闭包以及 SwiftUI 如何在主线程之外运行工作。
## SwiftUI 中的默认主 Actor
- `View` 默认是 `@MainActor` 隔离的;成员和 `body` 继承此隔离。
- Swift 6.2 可以为模块中的所有类型推断 `@MainActor`(新的语言模式)。
- 此默认设置简化了 UI 代码,并与 UIKit/AppKit 的 `@MainActor` API 保持一致。
## SwiftUI 在主线程之外运行代码的地方
- 为了性能,SwiftUI 可能会在后台线程上评估一些视图逻辑。
- 示例:`Shape` 路径生成、`Layout` 方法、`visualEffect` 闭包和 `onGeometryChange` 闭包。
- 这些 API 通常需要 `Sendable` 闭包来反映其运行时语义。
## Sendable 闭包和数据竞争安全性
- 从 `Sendable` 闭包访问 `@MainActor` 状态是不安全的,会被编译器标记。
- 优先在闭包捕获列表中捕获值拷贝(例如拷贝一个 `Bool`)。
- 避免仅为了读取单个属性而将 `self` 发送到 Sendable 闭包中。
## 使用 SwiftUI 构建异步工作
- SwiftUI 操作回调是同步的,因此 UI 更新(如加载状态)可以是即时的。
- 使用 `Task` 桥接到异步上下文;保持异步体尽可能小。
- 使用状态作为边界:异步工作更新模型/状态;UI 同步响应。
## 性能驱动的并发
- 将昂贵的工作从主 Actor 卸载,以避免卡顿。
- 保持时间敏感的 UI 逻辑(动画、手势响应)同步。
- 将 UI 代码与长时间运行的异步工作分离,以提高响应性和可测试性。