swift-concurrency-expert - swiftui-concurrency-tour-wwdc
2026/10/12 3:42:28
网站建设
项目流程
SwiftUI 并发之旅(摘要)
背景:面向 SwiftUI 的并发概述,涵盖 actor 隔离、Sendable 闭包,以及 SwiftUI 如何在主线程之外运行工作。
SwiftUI 中的主 actor 默认
View默认是@MainActor隔离的;成员和body继承隔离。- Swift 6.2 可以为模块中的所有类型推断
@MainActor(新的语言模式)。 - 这个默认简化了 UI 代码,并与 UIKit/AppKit 的
@MainActorAPI 保持一致。
SwiftUI 在主线程之外运行代码的地方
- SwiftUI 可能出于性能原因在后台线程上评估某些视图逻辑。
- 示例:
Shape路径生成、Layout方法、visualEffect闭包和onGeometryChange闭包。 - 这些 API 通常要求
Sendable闭包以反映其运行时语义。
Sendable 闭包与数据竞争安全
- 从
Sendable闭包访问@MainActor状态是不安全的,编译器会标记出来。 - 优先在闭包捕获列表中捕获值的副本(例如复制一个
Bool)。 - 避免仅仅为了读取单个属性而把
self发送进 sendable 闭包。
使用 SwiftUI 组织异步工作
- SwiftUI 动作回调是同步的,因此 UI 更新(如加载状态)可以立即进行。
- 使用
Task桥接到异步上下文;保持异步体最小化。 - 以状态为边界:异步工作更新模型/状态;UI 同步响应。
性能驱动的并发
- 将昂贵的工作从主 actor 卸载,以避免卡顿。
- 保持对时间敏感的 UI 逻辑(动画、手势响应)为同步。
- 将 UI 代码与长时间运行的异步工作分离,以提高响应性和可测试性。