Skip to content

使用 @ObservedObject 订阅外部对象

掌握 @ObservedObject 的奥秘

使用 @ObservedObject 是 SwiftUI 中管理外部引用类型数据流的关键。它允许视图响应外部对象的变化,从而实现动态的用户界面。当你有一个在视图外部定义的对象,并且希望视图能够观察到这个对象属性的变化时,@ObservedObject 就派上用场了。 🚀

这个属性包装器特别适合那些生命周期独立于视图的对象。例如,一个网络请求管理器或者一个复杂的业务逻辑模型。

构建可观察对象

要让一个对象能够被 @ObservedObject 观察,它必须遵循 ObservableObject 协议。此外,你还需要使用 @Published 属性包装器来标记那些你希望视图能够响应其变化属性。

swift
class UserSettings: ObservableObject {
    @Published var username: String = "Guest"
    @Published var score: Int = 0
}

在这个例子中,UserSettings 是一个可观察对象。当 usernamescore 属性发生变化时,任何订阅了 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 订阅它的变化。这种模式在大型应用中非常常见,因为它提供了清晰的数据流和所有权管理。你已经掌握了数据共享的关键一步!🎉

本站使用 VitePress 制作