@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 — 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 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.
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 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.
| Ssenariy | Tavsiya | Sabab |
|---|---|---|
| View ma’lumot yaratadi | @StateObject | View obyektga ega va uning hayotiy sik‡i uchun javobgar |
| View ma’lumot oladi | @ObservedObject | View 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 | @ObservedObject | Komponent 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 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.
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.
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.
// ❌ 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
}
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.
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.
@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
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.
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 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 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.
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
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.