如果我在SwiftUI中有一个ObservableObject,我可以将其称为@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()
}
相反,当重绘 View 时,@State变量将保留其值。
@StateObject @StateObject@ObservedObject@State的组合-即使丢弃 View 并重画 View ,ViewModel的实例也将保留并重新使用:
struct ContentView: View {
  @StateObject var viewModel = ViewModel()
}
性能
尽管如果强制 View 经常重新创建一个重量级的对象,但是@ObservedObject可能会影响性能,但是当@ObservedObject不复杂时,它就没有多大关系。
何时使用@ObservedObject
现在看来似乎没有理由使用@ObserverObject,那么什么时候应该使用它呢?

请注意,有太多的用例,有时可能需要在View中重新创建可观察的属性。在这种情况下,最好使用@ObservedObject
有用的链接:
  • What’s the difference between @StateObject and @ObservedObject?
  • What is the @StateObject property wrapper?
  • 10-08 11:23