在 SwiftUI 中使用 @StateObject 和 @ObservedObject 有效管理对象观测
2024-03-21 05:42:09
@StateObject 和 @ObservedObject: 掌握 SwiftUI 对象观测的艺术
前言
在 SwiftUI 中,跟踪和响应对象中的更改对于构建动态用户界面至关重要。这就是 @StateObject 和 @ObservedObject 属性包装器的用武之地。本文将深入探讨这两个属性包装器之间的关键差异,帮助你了解何时以及如何有效地使用它们。
@StateObject vs. @ObservedObject
对象所有权
@StateObject 用于视图拥有且负责管理的对象。这涉及创建、更新和销毁对象。
@ObservedObject 用于视图不拥有且不需要管理的对象。视图只是观察对象的变化,而对象由另一个视图或父视图创建和管理。
示例场景
想象一个包含 Counter 模型的 ContentView 。ContentView 创建并管理 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 中管理对象观测。通过了解它们之间的差异,你可以做出明智的决定,选择最适合特定用例的属性包装器。
常见问题解答
- 什么时候应该优先选择 @StateObject?
- 当视图需要完全控制对象的生命周期时。
- 什么时候应该优先选择 @ObservedObject?
- 当视图只需要观察对象的变化而无需管理它时。
- 对象何时应该使用 @StateObject 创建?
- 当对象与当前视图密切相关并需要与视图生命周期同步时。
- 对象何时应该使用 @ObservedObject 创建?
- 当对象与多个视图共享或由父视图或祖先视图管理时。
- 这是否适用于所有对象类型?
- 是的,@StateObject 和 @ObservedObject 适用于任何类或结构,只要它们遵循
ObservableObject
协议。
- 是的,@StateObject 和 @ObservedObject 适用于任何类或结构,只要它们遵循