如果我在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
。有用的链接: