美文网首页
SwiftUI:属性包装器@ObservedObject 和 @

SwiftUI:属性包装器@ObservedObject 和 @

作者: 喔牛慢慢爬 | 来源:发表于2024-09-17 09:43 被阅读0次

    @ObservedObject@StateObject 都是 SwiftUI 中用于处理视图和模型之间数据流的属性包装器,但它们有一些关键的区别。

    @ObservedObject

    • 用途:用于在视图中观察和响应遵循 ObservableObject 协议的对象的状态变化。
    • 生命周期@ObservedObject 关联的对象通常是由视图外部创建和管理的,视图只是观察它的变化。因此,对象的生命周期可能超出视图的生命周期。
    • 更新方式:当被观察对象的 @Published 属性发生变化时,视图会自动更新以反映新的状态。
    • 示例
      class MyModel: ObservableObject {
          @Published var someValue = 0
      }
      
      struct MyView: View {
          @ObservedObject var model = MyModel()
      
          var body: some View {
              Text("Value: \(model.someValue)")
          }
      }
      

    @StateObject

    • 用途:用于在视图中创建和管理一个遵循 ObservableObject 协议的对象,并确保该对象的生命周期与视图的生命周期相关联。
    • 生命周期@StateObject 会在视图被创建时初始化,并在视图被销毁时一同销毁。这意味着对象的生命周期与视图的生命周期是一致的。
    • 更新方式:与 @ObservedObject 类似,当 @StateObject@Published 属性发生变化时,视图也会自动更新。
    • 示例
      class MyModel: ObservableObject {
          @Published var someValue = 0
      }
      
      struct MyView: View {
          @StateObject private var model = MyModel()
      
          var body: some View {
              Text("Value: \(model.someValue)")
                  .onTapGesture {
                      model.someValue += 1
                  }
          }
      }
      

    关键区别

    • 生命周期管理@ObservedObject 通常用于外部创建的对象,其生命周期可能超出视图;而 @StateObject 是由视图创建和管理的,其生命周期与视图一致。
    • 所有权:使用 @ObservedObject 时,视图不拥有对象的所有权;而使用 @StateObject 时,视图拥有并管理对象的生命周期。
    • 初始化@StateObject 允许你在视图初始化时设置对象的初始状态,而 @ObservedObject 通常是在视图外部已经初始化好的对象。

    选择使用哪个属性包装器取决于你的具体需求,比如对象的所有权、生命周期管理以及初始化方式等。在大多数情况下,如果你需要在视图内部创建和管理一个模型对象,并且希望该对象的生命周期与视图一致,那么 @StateObject 是更合适的选择。如果你有一个外部创建的模型对象,并且只是希望在视图中观察它的状态变化,那么 @ObservedObject 是更好的选择。

    相关文章

      网友评论

          本文标题:SwiftUI:属性包装器@ObservedObject 和 @

          本文链接:https://www.haomeiwen.com/subject/ckpvljtx.html