返回

在 SwiftUI 中使用 @StateObject 和 @ObservedObject 有效管理对象观测

IOS

@StateObject 和 @ObservedObject: 掌握 SwiftUI 对象观测的艺术

前言

在 SwiftUI 中,跟踪和响应对象中的更改对于构建动态用户界面至关重要。这就是 @StateObject@ObservedObject 属性包装器的用武之地。本文将深入探讨这两个属性包装器之间的关键差异,帮助你了解何时以及如何有效地使用它们。

@StateObject vs. @ObservedObject

对象所有权

@StateObject 用于视图拥有且负责管理的对象。这涉及创建、更新和销毁对象。

@ObservedObject 用于视图不拥有且不需要管理的对象。视图只是观察对象的变化,而对象由另一个视图或父视图创建和管理。

示例场景

想象一个包含 Counter 模型的 ContentViewContentView 创建并管理 Counter ,因此使用 @StateObject

另一方面,ChildView 接收 Counter 作为参数,不负责管理它。因此,ChildView 使用 @ObservedObject 观察 Counter 的变化。

选择指南

一般来说:

  • @StateObject: 当视图需要完全控制对象时。
  • @ObservedObject: 当视图只需要观察对象的变化时。

深入理解

@StateObject 提供更多控制权,因为视图负责对象的生命周期。它简化了对象管理,因为它与视图生命周期相关联。

@ObservedObject 提供了更松散的耦合,因为视图不需要处理对象的管理。这使得对象可以跨多个视图共享,而无需担心生命周期问题。

@StateObject 仅适用于当前视图,而 @ObservedObject 可以在父视图或祖先视图中共享。

代码示例

ContentView (使用 @StateObject):

struct ContentView: View {
    @StateObject var counter = Counter()
}

ChildView (使用 @ObservedObject):

struct ChildView: View {
    @ObservedObject var counter: Counter
}

结论

@StateObject@ObservedObject 是强大的工具,用于在 SwiftUI 中管理对象观测。通过了解它们之间的差异,你可以做出明智的决定,选择最适合特定用例的属性包装器。

常见问题解答

  1. 什么时候应该优先选择 @StateObject?
    • 当视图需要完全控制对象的生命周期时。
  2. 什么时候应该优先选择 @ObservedObject?
    • 当视图只需要观察对象的变化而无需管理它时。
  3. 对象何时应该使用 @StateObject 创建?
    • 当对象与当前视图密切相关并需要与视图生命周期同步时。
  4. 对象何时应该使用 @ObservedObject 创建?
    • 当对象与多个视图共享或由父视图或祖先视图管理时。
  5. 这是否适用于所有对象类型?
    • 是的,@StateObject@ObservedObject 适用于任何类或结构,只要它们遵循 ObservableObject 协议。