Observation 解决什么

SwiftUI 早期用 ObservableObject,整个对象一变,所有观察它的视图都重绘。对象字段一多,刷新就粗放。Observation 框架把订阅粒度细化到属性:视图只读哪个属性,就只在那个属性变时刷新。

目标不是让状态可变,而是让刷新精确到视图真正读到的那一项。

这篇顺着 @Observable 把 SwiftUI 的数据流讲清。

从 ObservableObject 到 @Observable

老写法要手动标 @Published。新写法只要给类加 @Observable,所有存储属性自动变成可观察,不用逐个标注。

@Observable
class Cart {
  var count = 0
  var total = 0
}

一行注解,整类获得观察能力。

视图如何精确订阅

在视图里把可观察对象直接当属性用,不用 @StateObject、@ObservedObject 那一套包裹。SwiftUI 会自动追踪视图 body 里实际读到了哪些属性,只有那些属性变了才重算。

数据流速查
  • @Observable类可观察。
  • @State视图私有状态。
  • @Environment跨层级注入。
  • @Bindable双向绑定对象。

环境注入与共享

全局共享的对象放进环境:父视图注入,后代任意层级取用,省去一层层传。适合主题、登录态这类全局状态。代价是数据流变隐式,看单组件看不出值从哪来。

苹果 Observation:中央发光数据源节点向多个抽象视图卡片单向分流发光数据流的扁平科技插画
数据流:一个数据源,向多个视图精确分流。