@ObservedObject & @StateObject (@ObservedObject & @StateObject)
اینجا با ObservableObject آشنا می شویم. این یعنی «مدل قابل مشاهده». سپس @StateObject برای «مالک مدل» است. همچنین @ObservedObject برای «مصرف کننده مدل» در فرزندهاست. مثل دفتر نمره که دست مدیر است، اما معلم ها تغییرات را می بینند.
فرق @StateObject و @ObservedObject
@StateObject یعنی ویو «صاحب» مدل می شود. مدل اینجا ساخته و نگهداری می شود. @ObservedObject یعنی ویو «فقط مشاهده گر» است. بنابراین تغییرات مدل را می خواند و UI را تازه می کند.
نمونه عملی: شمارنده با مدل مشترک
والد مدل را با @StateObject می سازد. فرزند همان مدل را با @ObservedObject می گیرد. سپس با یک دکمه مقدار زیاد می شود.
import SwiftUI
class CounterModel: ObservableObject {
@Published var count = 0
}
struct Child: View {
@ObservedObject var model: CounterModel
var body: some View {
HStack {
Text("Count: \(model.count)")
Button("+1") {
model.count += 1
}
}
}
}
struct Parent: View {
@StateObject private var model = CounterModel()
var body: some View {
Child(model: model)
.padding()
}
}
import SwiftUI
struct ContentView: View {
var body: some View {
Parent()
}
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
نکته: هرجا «اولین مالک» هستید، از @StateObject استفاده کنید. هرجا فقط «مصرف کننده» هستید، از @ObservedObject استفاده کنید.
گام های عملی
- کلاس مدل را ObservableObject کن.
- ویژگی های قابل تازه شدن را @Published کن.
- در والد، مدل را با @StateObject بساز.
- به فرزند با @ObservedObject بده.
اشتباه های رایج
- @StateObject را در فرزند بازایجادشونده نساز.
- برای چندین فرزند، یک مدل مشترک بده.
- مقادیر سنگین را در View نگه ندار؛ داخل مدل بگذار.
مطالعه مرتبط
مسیر کامل در جریان داده در SwiftUI توضیح شده است. برای اتصال دوطرفه، صفحه Binding را ببین. همچنین برای اشتراک سراسری، ObservedObject و StateObject در سطح محیط را دنبال کن.
جمع بندی سریع
- @StateObject = مالک مدل.
- @ObservedObject = مشاهده گر مدل.
- @Published باعث تازه سازی UI می شود.
- والد بسازد، فرزند فقط مصرف کند.