@ObservedObject — SwiftUI-də property wrapper-dır ki, View-ə iyerarxiyanın başqa yerində yaradılmış ObservableObject-də dəyişiklikləri müşahidə etməyə imkan verir. @StateObject-dən fərqli olaraq, @ObservedObject obyekt yaratmır — o, yalnız onun objectWillChange publisher-ına abunə olur və @Published xassələri yeniləndikdə View-i yenidən çəkir. Bu, @ObservedObject-i valideyndən inizializator vasitəsilə məlumat alan uşaq View-lər üçün düzgün seçim edir. Paul Hudson — Hacking with Swift (2025) məqaləsinə görə, tipik SwiftUI tətbiqinin arxitekturası belə qurulur: kök View view model yaratmaq üçün @StateObject istifadə edir, bütün uşaq View-lər isə onu @ObservedObject vasitəsilə alır ki, bu da məlumatların təkrarlanmadan vahid həqiqət mənbəyini təmin edir.
Əsas məqamlar
@ObservedObject — View-i ObservableObject dəyişikliklərinə abunə edən property wrapper-dır. @ObservedObject ilə işarələnmiş obyekt @Published ilə elan edilmiş hər hansı xassəsini dəyişdikdə, SwiftUI avtomatik olaraq View-i yenidən çəkir. @ObservedObject obyekt yaratmır — o, yalnız mövcud ObservableObject nümunəsi ilə onun dəyişikliklərinə reaksiya verməli olan View arasında əlaqə qurur.
@ObservedObject ilə @StateObject arasındakı əsas fərq — sahiblikdir. @ObservedObject obyektin View iyerarxiyasında yuxarıda yaradıldığını və saxlandığını nəzərdə tutur. Uşaq View bu obyektin istinadını inizializator vasitəsilə alır və sadəcə onu müşahidə edir. Uşaq View yenidən yaradılarsa, valideyndən eyni istinadı alacaq — məlumatlar itirilməyəcək.
Apple Developer Documentation — SwiftUI (2025)-yə görə, @ObservedObject iOS 13-dən etibarən mövcuddur ki, bu da onu köhnə iOS versiyalarını dəstəkləyən layihələrdə ObservableObject-i müşahidə etmək üçün yeganə seçim edir. iOS 14+-də obyekt yaratmaq üçün @StateObject üstünlük təşkil edir, lakin @ObservedObject mövcud obyektlərini ötürmək üçün aktual qalır.
@ObservedObject mexanizmi Combine framework-dan ObservableObject protokoluna əsaslanır. ObservableObject-ə uyğun gələn hər bir sinif avtomatik olaraq objectWillChange publisher-ı alır ki, o da hər hansı @Published xassəsi dəyişməzdən əvvəl siqnal göndərir. SwiftUI @ObservedObject vasitəsilə bu publisher-a abunə olur və siqnal aldıqda View-i yenidən çəkilməli kimi qeyd edir.
class TaskViewModel: ObservableObject {
@Published var tasks: [Task] = []
@Published var isLoading = false
func loadTasks() async {
isLoading = true
// məlumatları yüklə
isLoading = false
}
}
struct TaskListView: View {
@ObservedObject var viewModel: TaskViewModel
var body: some View {
List(viewModel.tasks) { task in
Text(task.title)
}
.task { await viewModel.loadTasks() }
}
}
Valideyn View viewModel-i TaskListView-ə inizializator vasitəsilə ötürdükdə, SwiftUI obyekt və View arasında əlaqə yaradır. tasks massivi və ya isLoading bayrağı dəyişdikdə SwiftUI TaskListView-i yenidən çəkir. Obyekt isə dəyişməz qalır — o, valideyn View-də @StateObject vasitəsilə saxlanılır.
@ObservedObject ilə @StateObject arasındakı fərq — müşahidəçi ilə sahib arasındakı fərqdir. @StateObject obyekt yaradır və onun həyat dövrünü idarə edir. @ObservedObject yalnız başqa yerdə yaradılmış və saxlanılmış obyekti müşahidə edir. Onlar arasında seçim View-in məlumatlara görə məsuliyyəti ilə müəyyən edilir.
| Ssenari | Tövsiyə | Səbəb |
|---|---|---|
| View məlumat yaradır | @StateObject | View obyektə sahibdir və onun həyat dövrünə cavabdehdir |
| View məlumat alır | @ObservedObject | View yalnız müşahidə edir, obyekt valideyndə yaşayır |
| iOS 13 dəstəyi | @ObservedObject | @StateObject mövcud deyil, @ObservedObject-i əl ilə idarəetmə ilə istifadə edin |
| Təkrar istifadə olunan komponent | @ObservedObject | Komponent məlumat yaratmamalıdır — onu xaricdən alır |
Əsas qayda: əgər View obyekt yaradırsa — @StateObject. Əgər View obyekt qəbul edirsə — @ObservedObject. Bu qaydanın @ObservedObject lehinə pozulması obyekt yaratmaq üçün View yenidən qurulduqda məlumat itkisinə səbəb olur. @StateObject lehinə pozulması isə valideyndən asılı olmayan təkrarlanan nümunə yaradır.
@ObservedObject üçün tipik ssenari — kök View-in view model yaratdığı və siyahı xanasının onu @ObservedObject vasitəsilə aldığı tapşırıq siyahısıdır. Hər bir xana view model metodlarını çağıra bilər və dəyişikliklər avtomatik olaraq bütün siyahıda əks olunur, çünki bütün xanalar eyni obyekti müşahidə edir.
struct TaskRow: View {
@ObservedObject var viewModel: TaskViewModel
let task: Task
var body: some View {
HStack {
Text(task.title)
Spacer()
Button("Hazır") {
viewModel.completeTask(task)
}
}
}
}
struct TaskListContainer: View {
@StateObject var viewModel = TaskViewModel()
var body: some View {
List(viewModel.tasks) { task in
TaskRow(viewModel: viewModel, task: task)
}
}
}
Bu nümunədə TaskListContainer viewModel-i @StateObject vasitəsilə yaradır, hər bir TaskRow isə onu @ObservedObject vasitəsilə alır. İstifadəçi hər hansı sətirdə “Done” düyməsini kliklədikdə, viewModel.completeTask published xassəsini dəyişir və bu obyekti müşahidə edən bütün View-lər avtomatik yenilənir.
Ən geniş yayılmış səhv — View daxilində obyekt yaratmaq üçün @ObservedObject istifadə etməkdir. View yenidən qurulduqda (məsələn, state dəyişdikdə), SwiftUI yeni ObservableObject nümunəsi yaradır ki, bu da bütün toplanmış məlumatların itirilməsinə səbəb olur. Bu səhv xüsusilə NavigationStack-də ağrılıdır, burada istifadəçi formu doldura və geri qayıtdıqda məlumatları itirə bilər.
// ❌ Məlumat itkisi: @ObservedObject obyekti saxlamır
struct FormView: View {
@ObservedObject var formVM = FormViewModel()
// Hər View yenidən qurulduqda yeni formVM yaradılır!
}
// ✅ Düzgün: @StateObject obyekti saxlayır
struct FormView: View {
@StateObject var formVM = FormViewModel()
// Obyekt View-in həyatı boyunca bir dəfə yaradılır
}
Əgər uşaq View eyni ObservableObject-i @StateObject vasitəsilə elan edirsə, müstəqil surət yaradır. Valideyn obyektində dəyişikliklər uşaqda görünməyəcək və əksinə. Həmişə xaricdən obyekt alan uşaq View-lər üçün @ObservedObject istifadə edin.
Müasir SwiftUI-də @ObservedObject-ə bir neçə alternativ var, hər birinin öz üstünlükləri ilə. Seçim tətbiqin arxitekturasından, iOS versiyasından və konkret istifadə ssenarisindən asılıdır.
@ObservedObject ilə @EnvironmentObject arasında seçim — üslub və arxitektura məsələsidir. @ObservedObject View-in asılılıqlarını inizializator vasitəsilə açıq şəkildə göstərir ki, bu da kodu daha proqnozlaşdırılan edir. @EnvironmentObject dərin iyerarxiyalar üçün əlverişlidir, lakin asılılıqları gizlədir ki, bu da sazlamağı çətinləşdirə bilər.
Tez-tez verilən suallar
Bəli, əgər obyekt SwiftUI xaricində yaradılır və saxlanılırsa — məsələn, AppDelegate və ya sinqletonda. Bu halda @ObservedObject sadəcə mövcud obyektin dəyişikliklərinə abunə olur. Lakin SwiftUI iyerarxiyası daxilində yaradılan obyektlər üçün həmişə yuxarıda @StateObject lazımdır.
Ən çox ehtimal olunan səbəb — xassənin @Published vasitəsilə deyil dəyişdirilməsi və ya obyektin özünün deyil, onun daxili strukturunun objectWillChange çağırılmadan dəyişdirilməsidir. Kolleksiyalar üçün yeni surətin mənimsədilməsindən istifadə edin: array.append() kifayət deyil — massivi yenidən array = array + [element] vasitəsilə mənimsətmək lazımdır.
@ObservedObject özlüyündə əhəmiyyətli yük yaratmır. Problemlər @Published xassələrinin tez-tez dəyişdirilməsi zamanı yaranır — hər dəyişiklik bütün müşahidə edən View-lərin yenidən çəkilməsinə səbəb olur. Optimizasiya üçün EquatableView istifadə edin, published xassələrinin sayını azaldın və lazımsız yeniləmələrdən qaçının.
@ObservedObject bütün ObservableObject sinfini müşahidə edir və onun published xassələrinin hər hansı dəyişməsində View-i yenidən çəkir. @Binding konkret dəyərlə (String, Int, Bool) ikitərəfli əlaqə yaradır və onu oxumağa və yazmağa imkan verir. @Binding daha yüngüldür və ObservableObject tələb etmir.
Bəli, bu standart nümunədir. ObservableObject daxilində @Published avtomatik olaraq @ObservedObject ilə inteqrasiya olunur. Hər bir @Published xassəsi objectWillChange publisher-ına müşahidəçi əlavə edir. Onlardan hər hansı biri dəyişdikdə, bu obyekt üçün @ObservedObject ilə bütün View-lər yenidən çəkilir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun