@ObservedObject 和 @StateObject 都是 SwiftUI 中用于處理視圖和模型之間數(shù)據(jù)流的屬性包裝器,但它們有一些關(guān)鍵的區(qū)別。
@ObservedObject
-
用途:用于在視圖中觀察和響應(yīng)遵循
ObservableObject協(xié)議的對(duì)象的狀態(tài)變化。 -
生命周期:
@ObservedObject關(guān)聯(lián)的對(duì)象通常是由視圖外部創(chuàng)建和管理的,視圖只是觀察它的變化。因此,對(duì)象的生命周期可能超出視圖的生命周期。 -
更新方式:當(dāng)被觀察對(duì)象的
@Published屬性發(fā)生變化時(shí),視圖會(huì)自動(dòng)更新以反映新的狀態(tài)。 -
示例:
class MyModel: ObservableObject { @Published var someValue = 0 } struct MyView: View { @ObservedObject var model = MyModel() var body: some View { Text("Value: \(model.someValue)") } }
@StateObject
-
用途:用于在視圖中創(chuàng)建和管理一個(gè)遵循
ObservableObject協(xié)議的對(duì)象,并確保該對(duì)象的生命周期與視圖的生命周期相關(guān)聯(lián)。 -
生命周期:
@StateObject會(huì)在視圖被創(chuàng)建時(shí)初始化,并在視圖被銷毀時(shí)一同銷毀。這意味著對(duì)象的生命周期與視圖的生命周期是一致的。 -
更新方式:與
@ObservedObject類似,當(dāng)@StateObject的@Published屬性發(fā)生變化時(shí),視圖也會(huì)自動(dòng)更新。 -
示例:
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 } } }
關(guān)鍵區(qū)別
-
生命周期管理:
@ObservedObject通常用于外部創(chuàng)建的對(duì)象,其生命周期可能超出視圖;而@StateObject是由視圖創(chuàng)建和管理的,其生命周期與視圖一致。 -
所有權(quán):使用
@ObservedObject時(shí),視圖不擁有對(duì)象的所有權(quán);而使用@StateObject時(shí),視圖擁有并管理對(duì)象的生命周期。 -
初始化:
@StateObject允許你在視圖初始化時(shí)設(shè)置對(duì)象的初始狀態(tài),而@ObservedObject通常是在視圖外部已經(jīng)初始化好的對(duì)象。
選擇使用哪個(gè)屬性包裝器取決于你的具體需求,比如對(duì)象的所有權(quán)、生命周期管理以及初始化方式等。在大多數(shù)情況下,如果你需要在視圖內(nèi)部創(chuàng)建和管理一個(gè)模型對(duì)象,并且希望該對(duì)象的生命周期與視圖一致,那么 @StateObject 是更合適的選擇。如果你有一個(gè)外部創(chuàng)建的模型對(duì)象,并且只是希望在視圖中觀察它的狀態(tài)變化,那么 @ObservedObject 是更好的選擇。