@ObservedObject: bu nima, qanday ishlaydi va misollar

Muallif: IT Sectr Nashr etilgan: 2026-06-19 O'qish vaqti: 7 daq

@ObservedObject — SwiftUI-dagi Property Wrapper bo'lib, tashqaridan uzatilgan ObservableObject nusxasini kuzatish uchun ishlatiladi. @StateObject-dan farqli o'laroq, @ObservedObject obyekt yaratmaydi — u mavjud bo'lganning o'zgarishlariga obuna bo'ladi. Apple Developer Documentation (2025) ma'lumotlariga ko'ra, @ObservedObject ota-onaga tegishli ma'lumotlarni kuzatishi kerak bo'lgan farzand view-larda ishlatiladi. @ObservedObject obyektning hayotiy siklini boshqarmasdan reaktiv aloqani ta'minlaydi.

Asosiy

  • @ObservedObject — egalik qilmasdan ObservableObject-ni kuzatish uchun Property Wrapper
  • Yaratmasdan — obyekt ota-ona view yoki muhitdan uzatiladi
  • @Published — o'zgarishlarini SwiftUI kuzatadigan ObservableObject ichidagi xususiyatlar
  • Qayta chizish — @Published xususiyati o'zgarganda SwiftUI barcha obuna bo'lgan view-larni yangilaydi
  • @StateObject bilan adashtirmang — @ObservedObject yagona nusxani kafolatlamaydi

SwiftUI-da @ObservedObject nima?

@ObservedObject — view-ni ObservableObject o'zgarishlariga obuna qiladigan Property Wrapper. ObservableObject — Combine frameworkidan objectWillChange publisher-ni amalga oshirishni talab qiladigan protokol. @Published bilan belgilangan har qanday xususiyat ObservableObject ichida o'zgarganda, publisher signal yuboradi va SwiftUI @ObservedObject orqali obuna bo'lgan barcha view-larni qayta chizadi.

@ObservedObject-ning asosiy xususiyati egalik yo'qligi. View obyektni yaratish yoki yo'q qilish uchun javobgar emas. Obyekt ota-ona view-da (@StateObject orqali) yaratiladi yoki @EnvironmentObject orqali kiritiladi. Farzand view faqat o'zgarishlarni kuzatadi va yangilanishlarni oladi. Agar obyekt ota-onada almashtirilsa, @ObservedObject yangi nusxaga o'tadi.

@ObservedObject ma'lumot almashish stsenariylari uchun mos keladi: foydalanuvchi modeli, umumiy sozlamalar, serverga ulanish holati. Ierarxiyaning turli darajalaridagi bir nechta view bir xil ma'lumotlarni ko'rsatishi kerak bo'lganda, har bir view-dagi @ObservedObject bitta manbaga mustaqil, ammo muvofiqlashtirilgan obunalarni yaratadi.

@ObservedObject vs @StateObject: asosiy farqlar

@ObservedObject va @StateObject o'rtasidagi farq SwiftUI intervyularida eng ko'p beriladigan savollardan biridir. Asosiy qoida: @StateObject obyektni yaratadi va egalik qiladi, @ObservedObject esa mavjud bo'lganni kuzatadi. Ushbu qoidani buzish kutilmagan ma'lumot yo'qotilishiga yoki ikki marta inizializatsiyaga olib keladi.

Xususiyat@StateObject@ObservedObject
Obyekt yaratishHa, view inizializatsiyasidaYo'q, tayyor oladi
EgalikJoriy viewOta-ona komponent
Yagona nusxaHa, butun hayotiy sikl davomidaYo'q, almashtirilishi mumkin
Renderda qayta yaratishYo'q, saqlanadiOta-onaga bog'liq
Qayerda ishlatiladiIldiz view-egalikFarzand view-lar

@StateObject obyekt bir marta yaratilishini va view strukturasi qayta inizializatsiyalaridan omon qolishini kafolatlaydi. @ObservedObject obyektni tashqaridan oladi va ota-ona strukturasining har bir inizializatsiyasida qayta yaratiladi. Agar ota-ona obyekt uchun @StateObject ishlatsa, farzand view-lar xavfsiz tarzda @ObservedObject-ni qo'llashi mumkin — obyekt butun ierarxiyada yagona bo'ladi.

@ObservedObject o'zgarishlarni qanday kuzatadi

@ObservedObject-ning kuzatish mexanizmi Combine va ObservableObject protokoliga asoslanadi. Inizializatsiyada SwiftUI objectWillChange publisher-ni chaqiradi — obyekt @Published xususiyatini o'zgartirishdan oldin signal yuborishi kerak. Combine signalni SwiftUI-ning bog'liqlik grafigiga uzatadi, u barcha bog'liq view-larni yangilanish talab qiladigan deb belgilaydi. Bu qiymat o'zgarishidan oldin sinxron ravishda sodir bo'ladi.

swift
class WeatherService: ObservableObject {
    @Published var temperature: Double = 22.0
    @Published var city: String = "Moscow"
}

struct WeatherView: View {
    @ObservedObject var weather: WeatherService

    var body: some View {
        VStack {
            Text("\\(weather.city)")
            Text("\\(weather.temperature)°C")
        }
    }
}

Listingda WeatherService ikkita @Published xususiyatiga ega ObservableObject. WeatherView @ObservedObject var weather: WeatherService deb e'lon qiladi, nusxani ota-onadan oladi. Temperature o'zgarganda, objectWillChange yangi qiymat o'rnatilishidan oldin ishga tushadi, SwiftUI WeatherView-ni qayta chizadi va joriy harorat ko'rsatiladi. Obuna avtomatik ravishda SwiftUI tomonidan boshqariladi — dasturchi sink yoki dispose chaqirishga hojat yo'q.

@ObservedObject ishlatish namunalari

Birinchi namuna — modelni inizializator orqali uzatish. Ota-ona ObservableObject-ni @StateObject orqali yaratadi va uni farzand view-larga @ObservedObject sifatida uzatadi. Bu standart ierarxik ma'lumot uzatish bo'lib, unda ildiz view modelning hayotiy siklini boshqaradi va barcha ichki komponentlar o'zgarishlarga obuna bo'ladi.

Ikkinchi namuna — EnvironmentObject, SwiftUI Environment orqali @ObservedObject-ning global versiyasi. Obyekt sahna yoki ildiz view darajasida kiritiladi va barcha farzand komponentlarga inizializatorlar orqali aniq uzatilmasdan avtomatik ravishda mavjud bo'ladi. Farzand view ichida @EnvironmentObject @ObservedObject kabi ishlaydi, lekin obyektni muhitdan oladi.

Uchinchi namuna — bir nechta ObservableObject kompozitsiyasi. Murakkab ilovalarda view bir nechta obyektlarni kuzatishi mumkin: @ObservedObject var user: UserService, @ObservedObject var network: NetworkMonitor. Bu mas'uliyatni xizmatlar o'rtasida taqsimlaydi va har bir komponentning test qilinishini saqlaydi.

swift
struct DashboardView: View {
    @ObservedObject var user: UserViewModel
    @ObservedObject var network: NetworkMonitor

    var body: some View {
        VStack {
            Text("Xush kelibsiz, \\(user.name)")
            HStack {
                Circle()
                    .fill(network.isConnected ? Color.green : Color.red)
                    .frame(width: 10, height: 10)
            }
        }
    }
}

DashboardView UserViewModel va NetworkMonitor-ni kuzatadi. Har bir obyekt o'z ma'lumot sohasi uchun javobgar va mustaqil ravishda view-ni o'zgarishlar haqida xabardor qiladi. Agar tarmoq uzilsa, NetworkMonitor isConnected-ni o'zgartiradi va SwiftUI DashboardView-ni qayta chizadi, indikator rangini yangilaydi. ObservableObject kompozitsiyasi SwiftUI ilovalarida ma'lumotni tashkil qilishning afzal usulidir.

@Published: ObservableObject va SwiftUI aloqasi

@Published — Combine-dan ObservableObject ichidagi xususiyatga avtomatik nashir qo'shadigan Property Wrapper. @Published xususiyati o'zgarganda, Combine objectWillChange publisher orqali hodisa yaratadi. SwiftUI @ObservedObject yoki @StateObject ishlatganda ushbu publisher-ga obuna bo'ladi va har bir yangi qiymatda view-ni qayta chizadi.

@Published barcha turlarni, jumladan opsional, kolleksiyalar va maxsus strukturalarni qo'llab-quvvatlaydi. Biroq, kolleksiyalar (massivlar, lug'atlar) uchun SwiftUI faqat havolaning almashtirilishini kuzatadi, tarkibning o'zgarishini emas. Element qo'shilishi yoki olib tashlanishini aniqlash uchun kolleksiyani to'liq qayta tayinlash yoki qo'lda objectWillChange.send() bilan ObservableObject ishlatish kerak.

Muhim tafsilot: @Published faqat ObservableObject-ni amalga oshiradigan sinf ichida joylashishi kerak. @Published-ni ObservableObject-dan tashqarida ishlatish kompilyatsiya xatosiga olib keladi. Shuningdek, @Published-ni dangasa inizializatsiya (lazy var) yoki hisoblangan xususiyatlarga (computed property) qo'llash mumkin emas.

@ObservedObject bilan odatiy xatolar

Eng muhim xato — @ObservedObject-ni obyekt yaratish uchun ishlatish. Agar ota-ona view-da @ObservedObject var model = UserViewModel() deb yozsangiz, har bir renderda yangi UserViewModel nusxasi yaratiladi. Ma'lumotlar yo'qoladi va @Published obunalari qayta yaratiladi. Har doim yaratish uchun @StateObject va faqat tayyor obyektni olish uchun @ObservedObject ishlating.

Ikkinchi xato — @Published xususiyatlarini asosiy oqimdan tashqarida o'zgartirish. ObservableObject Combine-dan foydalanadi, u o'zgarishlarni asosiy oqimda (main actor) yuborishni talab qiladi. Agar @Published-ni fon navbatida o'zgartirsangiz, SwiftUI view-ni noqulay vaqtda qayta chizishi mumkin, race conditions keltirib chiqaradi. Yangilash uchun DispatchQueue.main.async yoki @MainActor ishlating.

Uchinchi muammo — tsiklik yangilanishlar. Agar @Published o'zgarishi yana @Published-ni o'zgartiradigan yon ta'sirlarni keltirib chiqarsa, cheksiz qayta chizish aylanishi yuzaga keladi. Yechim: himoya bayroqlari (isUpdating) ishlatish yoki mantiqni aniq mas'uliyat chegaralari bilan turli ObservableObject-larga ajratish.

Ko'p beriladigan savollar

@ObservedObject opsional bo'lishi mumkinmi?

Ha, SwiftUI @ObservedObject var model: UserViewModel?-ni qo'llab-quvvatlaydi. Biroq view obyekt nil bo'lgan vaqtda o'zgarishlarga obuna bo'lmaydi. Qiymat tayinlanganda obuna avtomatik ravishda faollashadi.

@ObservedObject @EnvironmentObject-dan qanday farq qiladi?

@ObservedObject obyektni inizializator orqali oladi, @EnvironmentObject — SwiftUI Environment orqali. @EnvironmentObject konstruktorlar orqali aniq uzatishni talab qilmaydi, lekin obyekt ierarxiyaning yuqori darajasida kiritilgan bo'lishi kerak.

SwiftUI-ni ObservableObject o'zgarishi haqida qo'lda qanday xabardor qilish mumkin?

Xususiyatni o'zgartirishdan oldin objectWillChange.send()-ni chaqiring. Bu @Published mos kelmaganida foydali (masalan, hisoblangan xususiyatlar yoki mutatsiyadan oldin o'zgarish haqida xabar berish kerak bo'lgan kolleksiya operatsiyalari uchun).

Nega @ObservedObject massiv ichidagi o'zgarishda view-ni qayta chizmaydi?

@ObservedObject va @Published havolaning almashtirilishini kuzatadi, kolleksiya tarkibining mutatsiyasini emas. Qayta chizish uchun massivni qayta tayinlash kerak: items.append(newItem) → items = items yoki mutatsiyadan oldin objectWillChange.send() ishlatish kerak.

@ObservedObject View-ni amalga oshirmaydigan strukturada ishlatilishi mumkinmi?

Yo'q, @ObservedObject faqat View protokolini amalga oshiradigan turlar ichida mavjud bo'lgan SwiftUI Property Wrapper. Oddiy strukturalar uchun Combine-dan to'g'ridan-to'g'ri ObservableObjectPublisher bilan foydalaning.

Xulosa

  • @ObservedObject — egalik qilmasdan ObservableObject-ni kuzatish uchun Property Wrapper
  • @StateObject — obyekt yaratadi, @ObservedObject — mavjudni kuzatadi
  • @Published — ObservableObject xususiyatlari uchun avtomatik nashir
  • Obuna — SwiftUI @ObservedObject ishlatganda Combine obunasini avtomatik boshqaradi
  • Kompozitsiya — view bir vaqtning o'zida bir nechta ObservableObject-ni kuzatishi mumkin
  • Main actor — @Published xususiyatlari faqat asosiy oqimda o'zgartirilishi kerak
  • EnvironmentObject — muhit orqali yashirin uzatish uchun @ObservedObject alternativi

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