Observer — o'zgarishlarga obuna bo'lish namunasining asosiy tushunchalari

Muallif: IT Sectr Nashr etilgan: 2026-02-17 O'qish vaqti: 7 daq

Observer — xulq-atvor namunasi, unda bir ob'ekt (nashir) o'z holatining o'zgarishi haqida ko'plab obunachilarni xabardor qiladi. Mobil ishlanmada Observer reaktiv mexanikaning asosini tashkil etadi: UI ma'lumotlar o'zgarishlariga obuna bo'ladi va avtomatik yangilanadi. Namuna iOS-da NotificationCenter va Android-da LiveData/Flow orqali amalga oshiriladi. Batafsil — Refactoring Guru: Observer.

Asosiy fikrlar

  • Observer — obuna namunasi: bir nashir, ko'plab obunachilar
  • NotificationCenter — iOS/macOS-da Observer-ning o'rnatilgan tatbiqi
  • Flow va LiveData — Android-da Observer-ning reaktiv tatbiqlari
  • Push vs Pull — nashir ma'lumotlarni yuborishi yoki hodisalar haqida xabardor qilishi mumkin
  • Xotira oqishi — obunachilar oqishning oldini olish uchun obunani bekor qilishlari kerak

Observer nima: kuzatuvchi namunasining mohiyati?

Observer (kuzatuvchi) — ob'ektlar orasidagi «birdan ko'pga» bog'liqlikni belgilaydigan GoF xulq-atvor namunasi. Bir ob'ekt (Subject yoki Observable) holatini o'zgartirganda, barcha bog'liq ob'ektlar (Observers) avtomatik xabardor qilinadi va yangilanadi. Namuna zaif bog'lanishni amalga oshiradi: nashir obunachilarning aniq sinflarini bilmaydi — faqat ular Observer interfeysini tatbiq qilishini biladi.

Observer tuzilmasi attach(), detach(), notify() metodlari bilan Subject interfeysi va update() metodi bilan Observer interfeysini o'z ichiga oladi. ConcreteSubject holat va obunachilar ro'yxatini saqlaydi. ConcreteObserver update()-ni tatbiq qiladi va o'zgarishlarga reaksiya beradi. Mobil ishlanmada GoF-ning klassik tatbiqi kam uchraydi — uni o'rnatilgan mexanizmlar almashtiradi: NotificationCenter, Combine, Flow, LiveData, ular bir xil g'oyani zamonaviy API bilan amalga oshiradi.

Push vs Pull modeli — Push modelida Subject barcha obunachilarga ma'lumotlarni yuboradi (NotificationCenter.post). Pull modelida Subject faqat xabardor qiladi, obunachi esa ma'lumotlarni o'zi oladi. Android LiveData Push-dan foydalanadi (ma'lumotlar observe()-da uzatiladi), RxJava/Flow ikkala modelni ham qo'llab-quvvatlaydi. Tanlov vazifaga bog'liq: Push UI yangilanishlari uchun sodda, Pull obunachi olishni istamaydigan katta hajmdagi ma'lumotlar uchun samaraliroq.

iOS-da Observer: NotificationCenter, Combine va KVO

NotificationCenter — Observer-ni tatbiq qilish uchun iOS/macOS-ning o'rnatilgan mexanizmi. Nashir Notification-ni NotificationCenter.default.post(name:, object:, userInfo:) orqali yuboradi. Obunachi addObserver(forName:, queue:, using:) orqali ro'yxatdan o'tadi. NotificationCenter nomlangan xabardorliklarni (Notification.Name) qo'llab-quvvatlaydi va userInfo-da istalgan ma'lumotni uzata oladi. UIKeyboardWillShowNotification, UIApplicationDidEnterBackgroundNotification — tizim misollari.

swift
extension Notification.Name {
    static let userDidLogin = Notification.Name("userDidLogin")
}

// Nashir
NotificationCenter.default.post(
    name: .userDidLogin,
    object: nil,
    userInfo: ["userId": "123"]
)

// Obunachi
class ProfileViewModel {
    private var observers: [NSObjectProtocol] = []

    func startObserving() {
        let observer = NotificationCenter.default.addObserver(
            forName: .userDidLogin,
            object: nil,
            queue: .main
        ) { [weak self] notification in
            guard let userId = notification.userInfo?["userId"] as? String else { return }
            // Obunachi hodisaga reaksiya beradi
            self?.loadProfile(userId: userId)
        }
        observers.append(observer)
    }

    func stopObserving() {
        observers.forEach { NotificationCenter.default.removeObserver($0) }
        observers.removeAll()
    }
}

Combine framework — iOS 13-dan boshlab NotificationCenter-ga zamonaviy reaktiv alternativ. Publisher (NotificationCenter, URLSession.Timer) — nashir, Subscriber (sink, assign) — obunachi. Combine ma'lumot oqimini transformatsiya qilish uchun operatorlar (map, filter, combineLatest) qo'shadi. @Published — obunachilarni o'zgarishlar haqida avtomatik xabardor qiladigan property wrapper. SwiftUI bilan MVVM-da Combine ViewModel va View-ni bog'lash uchun NotificationCenter-ni almashtiradi.

KVO (Key-Value Observing) — ob'ektlarning alohida xususiyatlarini kuzatish uchun eski ObjC/Swift mexanizmi. @objc dynamic var name: String — kuzatiladigan xususiyat. observe(.name) — obuna. KVO faqat @objc-mos sinflar va ObjC merosi bilan ishlaydi. Apple yangi loyihalarda KVO o'rniga Combine va @Published-ni tavsiya qiladi. KVO gibrid loyihalarda UIKit mosligi uchun dolzarbligicha qolmoqda.

Android-da Observer: LiveData, StateFlow va SharedFlow

LiveData — Observer-ni tatbiq qilish uchun Android Architecture Components komponenti. Ma'lumotlar o'zgarishlari haqida obunachilarni xabardor qiladigan Observable sinfi. LiveData hayot aylanishini hisobga oladi: obunachilar (LifecycleOwner) yo'q qilinganda avtomatik obunani bekor qiladi. LiveData Push modeli: ma'lumotlar observe()-da uzatiladi. LiveData Jetpack Compose joriy etilgunga qadar Android-da MVVM-ning asosiy qurilish bloki.

kotlin
// ViewModel — nashir
class UserViewModel : ViewModel() {
    private val _user = MutableLiveData<User?>(null)
    val user: LiveData<User?> = _user

    fun loadUser(id: String) {
        viewModelScope.launch {
            val result = userRepository.getUser(id)
            _user.value = result
        }
    }
}

// Fragment — obunachi
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        viewModel.user.observe(viewLifecycleOwner) { user ->
            // Obunachi o'zgarishlarga reaksiya beradi
            userName.text = user?.name
            userEmail.text = user?.email
        }
    }
}

StateFlow va SharedFlow — Jetpack Compose-da LiveData-ni almashtirgan Kotlin Coroutines-dan reaktiv tiplar. StateFlow — qat'iy joriy qiymatga ega kuzatiladigan state holder. SharedFlow — holatsiz sozlanishi hot flow, bir martalik hodisalar (navigatsiya, tostlar) uchun mos. Ikkala tip Compose bilan yaqindan integratsiyalangan: collectAsState(), collectAsEffect(). StateFlow Compose bilan zamonaviy Android loyihalarida majburiydir.

LiveData vs StateFlow — LiveData Android Lifecycle-ga bog'langan, StateFlow platformadan mustaqil. StateFlow coroutines, operatorlar (map, filter) ni qo'llab-quvvatlaydi va Android bog'liqliklarisiz test qilinadi. LiveData Java muvofiqligi uchun sodda. Google Kotlin + Compose bilan yangi loyihalar uchun StateFlow, eski loyihalar yoki Java kodi uchun LiveData-ni tavsiya qiladi.

Obunalarni boshqarish va xotira oqishi

Xotira oqishi (memory leaks) — obunalarni to'g'ri boshqarmasdan Observer-ning asosiy muammosi. Agar obunachi (Activity, Fragment, UIViewController) yo'q qilingan bo'lsa, lekin obunani bekor qilmagan bo'lsa, nashir unga havolani saqlashda davom etadi va garbage collector xotirani bo'shata olmaydi. Android-da LifecycleOwner (Activity/Fragment) removeObserver() chaqirishi yoki observe(viewLifecycleOwner) dan foydalanishi kerak. iOS-da — deinit-da removeObserver yoki Combine-da disposeBag.

PlatformaObserver mexanizmiAvtomatik obuna bekor qilishQo'lda obuna bekor qilish
iOSNotificationCenterYo'qdeinit-da removeObserver()
iOSCombine (sink)Yo'qstore(in: &bag) — DisposeBag
iOSKVOYo'qdeinit-da removeObserver()
AndroidLiveDataHa (LifecycleOwner)removeObserver() ixtiyoriy
AndroidStateFlowviewModelScope orqaliObuna bekor qilishda cancel() Job
AndroidRxJavaYo'qCompositeDisposable-da dispose()

Obunachilarda kuchsiz havola (weak reference) — obuna blokida Swift-da [weak self] ishlating va Kotlin-da lifecycle scope-ga havola qiling. LiveData obunani LifecycleOwner orqali avtomatik boshqaradi — obuna faqat Lifecycle STARTED yoki RESUMED holatida bo'lganda faol. Compose-da StateFlow lifecycle-ni hisobga olgan holda collectAsState() dan foydalanadi. iOS-da NotificationCenter aniq [weak self] talab qiladi, chunki closure self-ga kuchli havola qiladi.

Observer vs Publisher-Subscriber: farq nima

Observer (GoF) va Publisher-Subscriber (PubSub) — o'xshash, ammo farqli namunalar. Observer-da nashir obunachilarni to'g'ridan-to'g'ri ularning metodlarini chaqirib xabardor qiladi. Nashir obunachilar haqida biladi (ro'yxatni saqlaydi). PubSub-da nashir va obunachi bir-biri haqida bilmaydi — ular orasida vositachi (Event Bus, Message Queue, NotificationCenter) bor. Nashir kanalga xabar yuboradi, obunachi kanalni tinglaydi. PubSub zaifroq bog'lanishni ta'minlaydi.

Mobil ishlanmada PubSub misollari — iOS-da NotificationCenter PubSub deb hisoblanishi mumkin: nashir obunachilarni tanimaydi — shunchaki xabardorlikni joylashtiradi. Android-da EventBus yoki Otto (eskirgan). BroadcastChannel bilan SharedFlow — Kotlin dunyosida PubSub. Tarqalgan tizimlarda PubSub RabbitMQ, Kafka, Google PubSub orqali amalga oshiriladi. Mobil ishlanmada PubSub modulli arxitekturada foydali, bunda modullar bir-biriga bog'liq bo'lmasligi kerak.

Nimani tanlash — UI yangilanishlari uchun (ViewModel → View) Observer dan foydalaning (LiveData, StateFlow, @Published). Modullararo hodisalar uchun (avtorizatsiya, akkauntdan chiqish, mavzu o'zgarishi) — PubSub (SharedFlow, NotificationCenter, EventBus). Observer bir ekran ichida sodda va samarali, PubSub global hodisalar uchun moslashuvchan, ammo yashirin bog'liqliklar tufayli tuzatishda qiyinroq.

Tez-tez beriladigan savollar

StateFlow LiveData-dan qanday farq qiladi?

StateFlow Kotlin Coroutines-dan platformadan mustaqil tip, LiveData Android Lifecycle-ga bog'langan. StateFlow coroutines va operatorlarni qo'llab-quvvatlaydi, Android holda test qilinadi. LiveData obunani LifecycleOwner orqali avtomatik boshqaradi. Google Kotlin + Compose bilan yangi loyihalar uchun StateFlow, Java muvofiqligi uchun LiveData-ni tavsiya qiladi.

NotificationCenter bilan xotira oqishidan qanday qochish mumkin?

Handler closure-da [weak self] ishlating va deinit-da removeObserver() chaqiring. Observer-ga (NSObjectProtocol) havola saqlang va ob'ekt yo'q qilinganda uni o'chiring. Combine-da DisposeBag bo'shatilganda avtomatik obuna bekor qilish uchun AnyCancellable va store(in:) dan foydalaning.

SwiftUI-da Combine holda Observer ishlatish mumkinmi?

Ha, SwiftUI @Published bilan ObservableObject va @StateObject/@ObservedObject-ni qo'llab-quvvatlaydi — bu o'rnatilgan Observer tatbiqi. @Published View-ni o'zgarishlar haqida avtomatik xabardor qiladi. Combine majburiy emas: ObservableObject SwiftUI-ga o'rnatilgan objectWillChange Publisher-dan foydalanadi. Combine oqimlarni transformatsiya qilish uchun operatorlar qo'shadi.

Qachon StateFlow o'rniga SharedFlow ishlatish kerak?

SharedFlow — bir martalik hodisalar (navigatsiya, tostlar, Snackbar) uchun, bunda joriy qiymat kerak emas. StateFlow — UI holati (ma'lumotlar ro'yxati, yuklash holati) uchun, bunda joriy snapshot kerak. SharedFlow value xususiyatiga ega emas va yangi obunachilarga oxirgi qiymatni qaytarmaydi.

iOS-da KVO va Combine o'rtasidagi farq nima?

KVO — eskirgan ObjC mexanizmi, @objc dynamic talab qiladi va faqat NSObject-dan meros olgan sinflar bilan ishlaydi. Combine — zamonaviy Swift framework, tip xavfsiz, operatorlar va SwiftUI bilan integratsiyaga ega. Combine KVO va NotificationCenter-ni almashtiradi. Apple yangi loyihalar uchun Combine-ni, eski kodni qo'llab-quvvatlash uchun faqat KVO-ni tavsiya qiladi.

Xulosa

  • Observer — obunachilarni o'zgarishlar haqida xabardor qilish uchun xulq-atvor namunasi
  • iOS NotificationCenter — nomlangan xabardorliklar bilan PubSub tatbiqi
  • iOS Combine — Publisher va Subscriber bilan reaktiv framework
  • Android LiveData — Android Architecture Components-dan lifecycle-aware Observer
  • Android StateFlow — Compose va korutinlar uchun reaktiv state holder
  • Xotirani boshqarish — oqishning oldini olish uchun majburiy obuna bekor qilish
  • Observer vs PubSub — to'g'ridan-to'g'ri obuna vs zaif bog'lanish uchun vositachi

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