0Pricing
Swift Academy · 课时

减少主体重新求值

减少不必要的视图重新计算。

减少主体重新求值 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

body 会频繁重新计算

每当输入发生变化时,SwiftUI 都会调用视图的 body。过于复杂或连接过多的 body 会过于频繁地重新计算,从而损害性能。

什么会触发重新评估

当 body 读取的任何 @State、@Binding、被观察对象或环境值发生变化时,或者父视图传入新值时,body 都会重新运行。

struct Row: View {
    let title: String // changes -> body re-runs
    var body: some View { Text(title) }
}

缩小观察范围

如果视图读取一个大型的完整 model,那么 model 的任何变化都会使其 body 重新运行。请只传入视图所需的具体值。

// Instead of passing the whole model:
struct Price: View {
    let amount: Decimal // narrow input
    var body: some View { Text(amount, format: .currency(code: "USD")) }
}

拆分大型视图

请将庞大的 body 拆分为较小的子视图。SwiftUI 只会重新评估输入确实发生变化的子视图,而不是整个屏幕。

struct Screen: View {
    var body: some View {
        VStack {
            Header()   // re-runs only if its inputs change
            ItemList()
            Footer()
        }
    }
}

Observable 与字段级跟踪

使用 @Observable 宏时,SwiftUI 会跟踪视图读取的具体属性。只读取 model.name 的视图会忽略对 model.count 的更改。

@Observable final class Model {
    var name = ""
    var count = 0
}
// A view reading only name won’t re-run when count changes

避免在 body 中执行工作

body 应该以低成本描述用户界面。高成本计算(排序、筛选)应放在 model 或缓存属性中,而不是在每次 body 调用时重新计算。

// Bad: sort inside body (runs every recompute)
// Good: sort once in the model, expose sorted array

稳定的闭包与输入

每次渲染都传入新构建的数组或闭包,可能会使 SwiftUI 的相等性检查失效。请提取稳定值,使输入在多次重新计算之间保持相等。

// Hoist constants out of body
private let columns = [GridItem(.flexible())]

警惕高成本初始化器

视图的 init 可能会运行很多次。请避免在其中执行高成本工作;即使不会渲染视图,SwiftUI 也会频繁创建视图值。

struct Card: View {
    init(_ item: Item) { /* keep this trivial */ }
    var body: some View { Text("Card") }
}

读取环境值会带来更新开销

读取环境值会使视图订阅该值。请只在需要的地方读取环境值,并将读取操作放在最小的子视图中,以限制重新评估范围。

@Environment(\.colorScheme) private var scheme

延迟容器

请使用 LazyVStack、LazyHStack 和 List,这样屏幕外的行只有在需要时才会构建,从而减少大型集合中的 body 调用次数。

ScrollView {
    LazyVStack {
        ForEach(items) { RowView(item: $0) }
    }
}

先测量,再优化

不要猜测哪个 body 最耗费资源。请使用 SwiftUI 性能分析工具找出 body 评估次数较高的视图,然后在那里应用这些技术。

快速检查:重新评估

请测试您对 body 重新评估的理解。

回顾:减少 body 重新评估

当输入发生变化时,body 会重新运行,因此请传递范围更小的值,将大型视图拆分为较小的子视图,并充分利用 @Observable 的字段级跟踪。让 body 和初始化器保持低成本,提取稳定输入,尽量少读取环境值,并为大型集合使用延迟容器。

在优化之前,请始终使用 SwiftUI 性能分析工具确认高开销位置。

常见问题解答

「减少主体重新求值」课时是免费的吗?

是的 — 「减少主体重新求值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「减少主体重新求值」这节课中我会学到什么?

减少不必要的视图重新计算。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「减少主体重新求值」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 理解视图身份
  2. 减少主体重新求值
  3. Equatable 视图与 @State 作用域
  4. 使用 SwiftUI Instrument 进行性能分析
← 返回 Swift Academy