使用 @ObservedObject 订阅外部对象
掌握 @ObservedObject 的奥秘
使用 @ObservedObject 是 SwiftUI 中管理外部引用类型数据流的关键。它允许视图响应外部对象的变化,从而实现动态的用户界面。当你有一个在视图外部定义的对象,并且希望视图能够观察到这个对象属性的变化时,@ObservedObject 就派上用场了。 🚀
这个属性包装器特别适合那些生命周期独立于视图的对象。例如,一个网络请求管理器或者一个复杂的业务逻辑模型。
构建可观察对象
要让一个对象能够被 @ObservedObject 观察,它必须遵循 ObservableObject 协议。此外,你还需要使用 @Published 属性包装器来标记那些你希望视图能够响应其变化属性。
swift
class UserSettings: ObservableObject {
@Published var username: String = "Guest"
@Published var score: Int = 0
}在这个例子中,UserSettings 是一个可观察对象。当 username 或 score 属性发生变化时,任何订阅了 UserSettings 实例的视图都会自动更新。这真是太棒了!✨
在视图中使用 @ObservedObject
在你的 SwiftUI 视图中,你可以像这样声明一个 @ObservedObject 属性:
swift
struct UserProfileView: View {
@ObservedObject var settings: UserSettings
var body: some View {
VStack {
Text("用户名: \(settings.username)")
Text("分数: \(settings.score)")
Button("增加分数") {
settings.score += 10
}
}
}
}当你创建 UserProfileView 的实例时,你需要传入一个 UserSettings 的实例。
- 重要提示: 确保你传入的是同一个实例,否则视图将无法正确观察到变化。
@ObservedObject 的生命周期管理
@ObservedObject 不会拥有它所包装的对象。这意味着对象的生命周期是由外部管理的。
- 如果外部对象被销毁,
@ObservedObject也会停止观察。 - 这与
@StateObject不同,@StateObject会拥有并管理其包装对象的生命周期。
例如,你可以在父视图中创建 UserSettings 实例,然后将其传递给子视图:
swift
struct ContentView: View {
@StateObject var appSettings = UserSettings() // 使用 @StateObject 拥有它
var body: some View {
UserProfileView(settings: appSettings)
}
}通过这种方式,appSettings 的生命周期由 ContentView 管理,而 UserProfileView 则通过 @ObservedObject 订阅它的变化。这种模式在大型应用中非常常见,因为它提供了清晰的数据流和所有权管理。你已经掌握了数据共享的关键一步!🎉