@ObservedObject: bu nədir, obyektlərin müşahidəsi və View yenilənməsi

Müəllif: IT Sectr Dərc olunub: 2026-06-26 Oxuma vaxtı: 9 dəq

@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 — valideyn View-də yaradılmış ObservableObject-i müşahidə etmək üçün property wrapper.
  • Obyektə sahib deyil — @StateObject-dən fərqli olaraq, @ObservedObject obyektin həyat dövrünü idarə etmir.
  • Dəyişikliklərə abunəlik — @Published xassələri dəyişdikdə View avtomatik yenidən çəkilir.
  • Inizializator vasitəsilə ötürmə — obyekt uşaq View-ə inizializator parametri vasitəsilə ötürülür.
  • iOS 13+ — @ObservedObject SwiftUI-nin ilk versiyasından mövcuddur, @StateObject-dən fərqli olaraq (iOS 14+).

SwiftUI-də @ObservedObject nədir

@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 necə işləyir

@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.

swift
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 vs @StateObject: nə vaxt nə istifadə etməli

@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.

SsenariTövsiyəSəbəb
View məlumat yaradır@StateObjectView obyektə sahibdir və onun həyat dövrünə cavabdehdir
View məlumat alır@ObservedObjectView 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@ObservedObjectKomponent 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 istifadə nümunələri

@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.

swift
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.

@ObservedObject ilə tipik səhvlər

Ə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.

Səhv: @ObservedObject @StateObject əvəzinə

swift
// ❌ 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
}

Səhv: @StateObject-in @ObservedObject lazım olan yerdə ötürülməsi

Ə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.

SwiftUI-də @ObservedObject alternativləri

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.

  • @EnvironmentObject — SwiftUI mühitindən obyekti açıq ötürmədən almağa imkan verir. Çox ekrana ehtiyacı olan obyektlər üçün əlverişlidir, lakin .environmentObject() vasitəsilə açıq tətbiq tələb edir.
  • @State + @Binding — sadə dəyər tipləri üçün ObservableObject lazım deyil. Saxlamaq üçün @State və uşaq View-lərə ötürmək üçün @Binding istifadə edin.
  • @AppStorage — View ilə avtomatik sinxronlaşmalı UserDefaults dəyərləri üçün.
  • @SceneStorage — səhnənin yenidən başladılması arasında müvəqqəti vəziyyəti saxlamaq üçün (məsələn, siyahıdakı mövqe).

@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

Valideyndə @StateObject olmadan @ObservedObject istifadə etmək olarmı?

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.

Niyə @ObservedObject bəzən View-i yeniləmir?

Ə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 performansa təsir edirmi?

@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 @Binding-dən nə ilə fərqlənir?

@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.

@ObservedObject və @Published eyni sinifdə birləşdirilə bilərmi?

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ə

  • @ObservedObject — iyerarxiyanın başqa yerində yaradılmış ObservableObject-i müşahidə etmək üçün property wrapper.
  • Obyektə sahib deyil — @StateObject-dən fərqli olaraq, @ObservedObject həyat dövrünü idarə etmir və obyekt yaratmır.
  • Combine vasitəsilə abunəlik — SwiftUI avtomatik olaraq ObservableObject-in objectWillChange publisher-ına abunə olur.
  • iOS 13+ — @ObservedObject SwiftUI-nin ilk versiyasından mövcuddur, köhnə dəstəyi olan layihələr üçün vacibdir.
  • Inizializator vasitəsilə ötürmə — obyekt uşaq View-ə açıq şəkildə ötürülür, bu da asılılıqları şəffaf edir.
  • Sahiblik səhvi — @ObservedObject-in obyekt yaratmaq üçün istifadəsi View yenidən qurulduqda məlumat itkisinə səbəb olur.
  • Alternativlər — mühit vasitəsilə tətbiq üçün @EnvironmentObject, dəyər tipləri üçün @State/@Binding.

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.

Layihəni müzakirə et

Həm də oxuyun