ios - SwiftUI 中的 ObservedObject 和 StateObject 有什么区别

标签 ios swift swiftui

如果我有一个 ObservableObject在 SwiftUI 中,我可以将其称为 @ObservedObject :

class ViewModel: ObservableObject {
    @Published var someText = "Hello World!"
}

struct ContentView: View {
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View {
        Text(viewModel.someText)
    }
}
或作为 @StateObject :
class ViewModel: ObservableObject {
    @Published var someText = "Hello World!"
}

struct ContentView: View {
    @StateObject var viewModel = ViewModel()

    var body: some View {
        Text(viewModel.someText)
    }
}
但两者之间的实际区别是什么?有没有一种情况比另一种更好,或者它们是两种完全不同的东西?

最佳答案

@ObservedObject
当 View 创建自己的 @ObservedObject每次丢弃和重绘 View 时都会重新创建它的实例:

struct ContentView: View {
  @ObservedObject var viewModel = ViewModel()
}
相反一个 @State重绘 View 时,变量将保持其值。
@StateObject
一个 @StateObject@ObservedObject的组合和 @State - ViewModel的实例即使在 View 被丢弃和重绘后,也将被保留和重用:
struct ContentView: View {
  @StateObject var viewModel = ViewModel()
}
性能
虽然 @ObservedObject如果 View 被迫经常重新创建重量级对象可能会影响性能,当 @ObservedObject 时应该没有太大关系。并不复杂。
何时使用@ObservedObject
现在似乎没有理由使用 @ObservedObject ,那么应该什么时候使用呢?

You should use @StateObject for any observable properties that you initialize in the view that uses it. If the ObservableObject instance is created externally and passed to the view that uses it mark your property with @ObservedObject.


请注意,可能的用例太多,有时可能需要在您的 View 中重新创建一个可观察的属性。在这种情况下,最好使用 @ObservedObject .
有用的链接:
  • What’s the difference between @StateObject and @ObservedObject?
  • What is the @StateObject property wrapper?
  • 关于ios - SwiftUI 中的 ObservedObject 和 StateObject 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62544115/

    相关文章:

    objective-c - 正在调用方法但未执行

    ios - 我怎样才能摆脱 "Update to recommended settings"警告?

    ios - 有没有办法在Box2D中绘制凹多边形并检测与其他形状的碰撞

    ios - 当项目从运行单个目标的多环境配置时,收到[上传处理所需的缺少的 dSYM]

    objective-c - 检测Xcode项目开发语言

    ios - UIGestureRecognizer 仅限于 CGRect

    swift - 在iOS 14中为SwiftUI更改Form UI

    layout - SwiftUI:相对于中央 View 进行布局

    SwiftUI:UIViewRepresentable 中的 updateUIView() 函数导致应用程序卡住和 CPU 峰值

    ios - 在 UIViewController 之间使用数组堆栈和动画会产生意外行为