@ObservedObject: bu nima, obyektlarni kuzatish va View yangilash

Muallif: IT Sectr Nashr etilgan: 2026-06-26 O'qish vaqti: 9 daq

@ObservedObject — SwiftUI‘dagi property wrapper bo‘lib, View‘ga iyerarxiyaning boshqa joyida yaratilgan ObservableObject‘dagi o‘zgarishlarni kuzatish imkonini beradi. @StateObject‘dan farqli o‘laroq, @ObservedObject obyekt yaratmaydi — u faqat uning objectWillChange publisher‘iga obuna bo‘ladi va @Published xususiyatlari yangilanganda View‘ni qayta chizadi. Bu @ObservedObject‘ni valiydan ini‡alizator orqali ma’lumot oladigan bolakay View‘lar uchun to‘g‘ri tanlovga aylantiradi. Paul Hudson — Hacking with Swift (2025) maqolasiga ko‘ra, SwiftUI ilovasining odatdagi arxitekturasi quyidagicha quriladi: ildiz View view model yaratish uchun @StateObject‘dan foydalanadi va barcha bolakay View‘lar uni @ObservedObject orqali oladi, bu ma’lumotlar takrorlanmasdan yagona haqiqat manbaini ta’minlaydi.

Asosiy fikrlar

  • @ObservedObject — ota-ona View‘da yaratilgan ObservableObject‘ni kuzatish uchun property wrapper.
  • Obyektga ega emas — @StateObject‘dan farqli o‘laroq, @ObservedObject obyektning hayotiy sik‡ini boshqarmaydi.
  • O‘zgarishlarga obuna — @Published xususiyatlari o‘zgarganda View avtomatik qayta chiziladi.
  • Ini‡alizator orqali uzatish — obyekt bolakay View‘ga ini‡alizator parametri orqali uzatiladi.
  • iOS 13+ — @ObservedObject SwiftUI‘ning birinchi versiyasidan mavjud, @StateObject‘dan farqli (iOS 14+).

SwiftUI‘da @ObservedObject nima

@ObservedObject — View‘ni ObservableObject o‘zgarishlariga obuna qiladigan property wrapper. @ObservedObject bilan belgilangan obyekt @Published bilan e’lon qilingan xususiyatlaridan birini o‘zgartirganda, SwiftUI avtomatik ravishda View‘ni qayta chizadi. @ObservedObject obyekt yaratmaydi — u faqat mavjud ObservableObject namunasi bilan uning o‘zgarishlariga reaksiya berishi kerak bo‘lgan View o‘rtasida bog‘lanish o‘rnatadi.

@ObservedObject va @StateObject o‘rtasidagi asosiy farq — egalikdir. @ObservedObject obyekt View iyerarxiyasida yuqorida yaratilgan va saqlangan deb taxmin qiladi. Bolakay View bu obyektning havolasini ini‡alizator orqali oladi va shunchaki uni kuzatadi. Agar bolakay View qayta yaratilsa, valiydan bir xil havolani oladi — ma’lumotlar yo‘qolmaydi.

Apple Developer Documentation — SwiftUI (2025) ga ko‘ra, @ObservedObject iOS 13 dan boshlab mavjud, bu uni eski iOS versiyalarini qo‘llab-quvvatlaydigan loyihalarda ObservableObject‘ni kuzatish uchun yagona variantga aylantiradi. iOS 14+ da obyekt yaratish uchun @StateObject afzal ko‘riladi, lekin @ObservedObject mavjud obyektlarni uzatish uchun dolzarbligicha qoladi.

@ObservedObject qanday ishlaydi

@ObservedObject mexanizmi Combine framework‘idagi ObservableObject protokoliga asoslanadi. ObservableObject‘ga mos keladigan har bir sinf avtomatik ravishda objectWillChange publisher‘ini oladi, u har qanday @Published xususiyati o‘zgarishidan oldin signal yuboradi. SwiftUI @ObservedObject orqali ushbu publisher‘ga obuna bo‘ladi va signalni qabul qilganda View‘ni qayta chizilishi kerak deb belgilaydi.

swift
class TaskViewModel: ObservableObject {
    @Published var tasks: [Task] = []
    @Published var isLoading = false
    
    func loadTasks() async {
        isLoading = true
        // ma'lumotlarni yuklab olish
        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() }
    }
}

Ota-ona View viewModel‘ni TaskListView‘ga ini‡alizator orqali uzatganda, SwiftUI obyekt va View o‘rtasida bog‘lanish yaratadi. tasks massivi yoki isLoading bayrog‘i o‘zgarganda SwiftUI TaskListView‘ni qayta chizadi. Obyekt esa o‘zgarmasdan qoladi — u ota-ona View‘da @StateObject orqali saqlanadi.

@ObservedObject vs @StateObject: qachon nimani ishlatish

@ObservedObject va @StateObject o‘rtasidagi farq — kuzatuvchi va egasi o‘rtasidagi farqdir. @StateObject obyekt yaratadi va uning hayotiy sik‡ini boshqaradi. @ObservedObject faqat boshqa joyda yaratilgan va saqlangan obyektni kuzatadi. Ular o‘rtasidagi tanlov View‘ning ma’lumotlar uchun mas’uliyati bilan belgilanadi.

SsenariyTavsiyaSabab
View ma’lumot yaratadi@StateObjectView obyektga ega va uning hayotiy sik‡i uchun javobgar
View ma’lumot oladi@ObservedObjectView faqat kuzatadi, obyekt valiyda yashaydi
iOS 13 qo‘llab-quvvatlashi@ObservedObject@StateObject mavjud emas, @ObservedObject‘ni qo‘l bilan boshqarish bilan ishlating
Qayta ishlatiladigan komponent@ObservedObjectKomponent ma’lumot yaratmasligi kerak — uni tashqaridan oladi

Asosiy qoida: agar View obyekt yaratsa — @StateObject. Agar View obyekt qabul qilsa — @ObservedObject. Ushbu qoidani @ObservedObject foydasiga buzish View qayta qurilganda ma’lumot yo‘qotilishiga olib keladi. @StateObject foydasiga buzish esa valiydan mustaqil takroriy namuna yaratadi.

@ObservedObject‘dan foydalanish misollari

@ObservedObject uchun odatdagi ssenariy — ildiz View view model yaratadigan va ro‘yxat xujayrasi uni @ObservedObject orqali oladigan topshiriqlar ro‘yxati. Har bir xujayra view model metodlarini chaqirishi mumkin va o‘zgarishlar avtomatik ravishda butun ro‘yxatda aks etadi, chunki barcha xujayralar bir xil obyektni kuzatadi.

swift
struct TaskRow: View {
    @ObservedObject var viewModel: TaskViewModel
    let task: Task
    
    var body: some View {
        HStack {
            Text(task.title)
            Spacer()
            Button("Tayyor") {
                viewModel.completeTask(task)
            }
        }
    }
}

struct TaskListContainer: View {
    @StateObject var viewModel = TaskViewModel()
    
    var body: some View {
        List(viewModel.tasks) { task in
            TaskRow(viewModel: viewModel, task: task)
        }
    }
}

Ushbu misolda TaskListContainer viewModel‘ni @StateObject orqali yaratadi, har bir TaskRow esa uni @ObservedObject orqali oladi. Foydalanuvchi har qanday qatorda “Done” tugmasini bosganda, viewModel.completeTask published xususiyatini o‘zgartiradi va ushbu obyektni kuzatayotgan barcha View‘lar avtomatik yangilanadi.

@ObservedObject bilan odatdagi xatolar

Eng keng tarqalgan xato — View ichida obyekt yaratish uchun @ObservedObject dan foydalanish. View qayta qurilganda (masalan, state o‘zgarganda), SwiftUI yangi ObservableObject namunasini yaratadi, bu barcha to‘plangan ma’lumotlarning yo‘qolishiga olib keladi. Bu xato ayniqsa NavigationStack‘da og‘riqli, bu yerda foydalanuvchi formani to‘ldirishi va orqaga qaytganda ma’lumotlarni yo‘qotishi mumkin.

Xato: @ObservedObject @StateObject o‘rniga

swift
// ❌ Ma’lumot yo‘qolishi: @ObservedObject obyektni saqlamaydi
struct FormView: View {
    @ObservedObject var formVM = FormViewModel()
    // Har View qayta qurilganda yangi formVM yaratiladi!
}

// ✅ To‘g‘ri: @StateObject obyektni saqlaydi
struct FormView: View {
    @StateObject var formVM = FormViewModel()
    // Obyekt View hayoti davomida bir marta yaratilgan
}

Xato: @StateObject‘ni @ObservedObject kerak bo‘lgan joyda uzatish

Agar bolakay View bir xil ObservableObject‘ni @StateObject orqali e’lon qilsa, mustaqil nusxa yaratadi. Valeyd obyektidagi o‘zgarishlar bolakayda ko‘rinmaydi va aksincha. Har doim tashqaridan obyekt oladigan bolakay View‘lar uchun @ObservedObject dan foydalaning.

SwiftUI‘da @ObservedObject‘ga alternativlar

Zamonaviy SwiftUI‘da @ObservedObject ga bir nechta alternativ mavjud, har biri o‘z afzalliklariga ega. Tanlov ilova arxitekturasi, iOS versiyasi va muayyan foydalanish ssenariysiga bog‘liq.

  • @EnvironmentObject — SwiftUI muhitidan obyektni ochiq uzatmasdan olish imkonini beradi. Ko‘p ekranlarda kerak bo‘ladigan obyektlar uchun qulay, lekin .environmentObject() orqali ochiq kiritishni talab qiladi.
  • @State + @Binding — oddiy qiymat turlari uchun ObservableObject kerak emas. Saqlash uchun @State va bolakay View‘larga uzatish uchun @Binding dan foydalaning.
  • @AppStorage — View bilan avtomatik sinxronlashishi kerak bo‘lgan UserDefaults qiymatlari uchun.
  • @SceneStorage — sahna qayta ishga tushirilishi o‘rtasida vaqtinchalik holatni saqlash uchun (masalan, ro‘yxatdagi pozitsiya).

@ObservedObject va @EnvironmentObject o‘rtasidagi tanlov — uslub va arxitektura masalasidir. @ObservedObject View‘ning bog‘liqliklarini ini‡alizator orqali ochiq ko‘rsatadi, bu kodni oldindan bashorat qilish mumkin qiladi. @EnvironmentObject chuqur iyerarxiyalar uchun qulay, lekin bog‘liqliklarni yashiradi, bu esa disk raskadrovkasini qiyinlashtirishi mumkin.

Tez-tez beriladigan savollar

Valiyda @StateObject bo‘lmasdan @ObservedObject‘dan foydalanish mumkinmi?

Ha, agar obyekt SwiftUI‘dan tashqarida yaratilgan va saqlangan bo‘lsa — masalan, AppDelegate yoki singletonda. Bu holda @ObservedObject shunchaki mavjud obyektning o‘zgarishlariga obuna bo‘ladi. Biroq SwiftUI iyerarxiyasi ichida yaratilgan obyektlar uchun har doim yuqorida @StateObject kerak.

Nima uchun @ObservedObject ba’zan View‘ni yangilamaydi?

Eng ko‘p ehtimol bo‘lgan sabab — xususiyat @Published orqali emas o‘zgartiriladi yoki obyektning o‘zi emas, balki uning ichki tuzilishi objectWillChange chaqirilmasdan o‘zgartiriladi. To‘plamlar uchun yangi nusxani tayinlashdan foydalaning: array.append() yetarli emas — massivni qayta array = array + [element] orqali tayinlash kerak.

@ObservedObject unumdorlikka ta’sir qiladimi?

@ObservedObject o‘z-o‘zidan sezilarli yuk yaratmaydi. Muammolar @Published xususiyatlarining tez-tez o‘zgartirilishi bilan yuzaga keladi — har bir o‘zgarish barcha kuzatuvchi View‘larning qayta chizilishiga sabab bo‘ladi. Optimizatsiya uchun EquatableView dan foydalaning, published xususiyatlar sonini kamaytiring va keraksiz yangilanishlardan qoching.

@ObservedObject @Binding‘dan qanday farq qiladi?

@ObservedObject butun ObservableObject sinfini kuzatadi va uning published xususiyatlarining har qanday o‘zgarishida View‘ni qayta chizadi. @Binding muayyan qiymat bilan (String, Int, Bool) ikki tomonlama bog‘lanish yaratadi va uni o‘qish va yozish imkonini beradi. @Binding engilroq va ObservableObject talab qilmaydi.

@ObservedObject va @Published bir sinfda birlashtirilishi mumkinmi?

Ha, bu standart namunadir. ObservableObject ichidagi @Published avtomatik ravishda @ObservedObject bilan integratsiyalanadi. Har bir @Published xususiyati objectWillChange publisher‘iga kuzatuvchi qo‘shadi. Ulardan birortasi o‘zgarganda, ushbu obyekt uchun @ObservedObject bilan barcha View‘lar qayta chiziladi.

Xulosa

  • @ObservedObject — iyerarxiyaning boshqa joyida yaratilgan ObservableObject‘ni kuzatish uchun property wrapper.
  • Obyektga ega emas — @StateObject‘dan farqli o‘laroq, @ObservedObject hayotiy sik‡ni boshqarmaydi va obyekt yaratmaydi.
  • Combine orqali obuna — SwiftUI avtomatik ravishda ObservableObject‘ning objectWillChange publisher‘iga obuna bo‘ladi.
  • iOS 13+ — @ObservedObject SwiftUI‘ning birinchi versiyasidan mavjud, eski qo‘llab-quvvatlashga ega loyihalar uchun muhim.
  • Ini‡alizator orqali uzatish — obyekt bolakay View‘ga ochiq uzatiladi, bog‘liqliklarni shaffof qiladi.
  • Egalik xatosi — @ObservedObject‘ni obyekt yaratish uchun ishlatish View qayta qurilganda ma’lumot yo‘qolishiga olib keladi.
  • Alternativlar — muhit orqali kiritish uchun @EnvironmentObject, qiymat turlari uchun @State/@Binding.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing