@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 — 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 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 yaratish | Ha, view inizializatsiyasida | Yo'q, tayyor oladi |
| Egalik | Joriy view | Ota-ona komponent |
| Yagona nusxa | Ha, butun hayotiy sikl davomida | Yo'q, almashtirilishi mumkin |
| Renderda qayta yaratish | Yo'q, saqlanadi | Ota-onaga bog'liq |
| Qayerda ishlatiladi | Ildiz view-egalik | Farzand 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-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.
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.
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.
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 — 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.
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
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 obyektni inizializator orqali oladi, @EnvironmentObject — SwiftUI Environment orqali. @EnvironmentObject konstruktorlar orqali aniq uzatishni talab qilmaydi, lekin obyekt ierarxiyaning yuqori darajasida kiritilgan bo'lishi kerak.
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).
@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.
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
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.