首先是 @ObservedObject 的例子。这是一个简单的视图,它创建并观察一个 User 对象。但是,每当视图重新渲染时,User
对象都会被重新创建。
swift
class User: ObservableObject {
@Published var name = "John Doe"
}
struct ContentView: View {
@ObservedObject var user = User()
var body: some View {
Text("Hello, \(user.name)!")
.onTapGesture {
user.name = "Jane Doe"
}
}
}
相反,如果我们使用 @StateObject,即使视图被重新渲染,
User 对象也会保持不变:
swift
class User: ObservableObject {
@Published var name = "John Doe"
}
struct ContentView: View {
@StateObject var user = User()
var body: some View {
Text("Hello, \(user.name)!")
.onTapGesture {
user.name = "Jane Doe"
}
}
}
在这两个例子中,当你点击文本并改变 user.name 时,视图都会重新渲染以显示新的名字。但是在 @ObservedObject 的例子中,如果存在其他触发视图重新渲染的因素(比如父视图的状态改变),那么 user 对象会被重新创建,name
会重新设置为 "John Doe"。而在 @StateObject 的例子中,即使视图被重新渲染,user
对象和 name 的状态也会保持不变。
因此,当视图需要创建和拥有一个对象,并且需要在视图的整个生命周期内保持对象的状态时,你应该优先使用 @StateObject
。
而当视图需要观察一个对象,但不需要拥有它,或者对象在视图重建时可以重新创建时,你应该使用 @ObservedObject
。