Observer — एक व्यवहारिक पैटर्न जिसमें एक वस्तु (प्रकाशक) अपनी स्थिति में परिवर्तन के बारे में कई सब्सक्राइबर्स को सूचित करती है। मोबाइल डेवलपमेंट में, Observer रिएक्टिव मैकेनिज्म की नींव है: UI डेटा परिवर्तनों की सदस्यता लेता है और स्वचालित रूप से अपडेट होता है। यह पैटर्न iOS में NotificationCenter और Android में LiveData/Flow में लागू किया गया है। अधिक जानकारी के लिए Refactoring Guru: Observer देखें।
मुख्य बिंदु
Observer — एक GoF व्यवहारिक पैटर्न जो वस्तुओं के बीच एक-से-अनेक निर्भरता को परिभाषित करता है। जब एक वस्तु (Subject या Observable) अपनी स्थिति बदलती है, तो सभी आश्रित वस्तुएँ (Observers) स्वचालित रूप से सूचित और अपडेट होती हैं। पैटर्न ढीला युग्मन लागू करता है: प्रकाशक सब्सक्राइबर्स के विशिष्ट वर्गों को नहीं जानता — केवल यह कि वे Observer इंटरफ़ेस लागू करते हैं।
Observer संरचना में attach(), detach(), notify() विधियों के साथ Subject इंटरफ़ेस और update() विधि के साथ Observer इंटरफ़ेस शामिल है। ConcreteSubject स्थिति और सब्सक्राइबर्स की सूची संग्रहीत करता है। ConcreteObserver update() लागू करता है और परिवर्तनों पर प्रतिक्रिया करता है। मोबाइल डेवलपमेंट में, GoF का क्लासिक कार्यान्वयन दुर्लभ है — इसे अंतर्निहित तंत्रों द्वारा प्रतिस्थापित किया जाता है: NotificationCenter, Combine, Flow, LiveData, जो आधुनिक API के साथ समान विचार लागू करते हैं।
Push vs Pull मॉडल — Push मॉडल में, Subject सभी सब्सक्राइबर्स को डेटा भेजता है (NotificationCenter.post)। Pull मॉडल में, Subject केवल सूचित करता है, और सब्सक्राइबर स्वयं डेटा का अनुरोध करता है। Android LiveData Push का उपयोग करता है (डेटा observe() में पास किया जाता है), RxJava/Flow दोनों मॉडलों का समर्थन करते हैं। चुनाव कार्य पर निर्भर करता है: Push UI अपडेट के लिए सरल है, Pull डेटा की बड़ी मात्रा के लिए अधिक कुशल है जिसे सब्सक्राइबर प्राप्त नहीं करना चाहता।
NotificationCenter — Observer को लागू करने के लिए iOS/macOS में एक अंतर्निहित तंत्र। प्रकाशक NotificationCenter.default.post(name:, object:, userInfo:) के माध्यम से Notification भेजता है। सब्सक्राइबर addObserver(forName:, queue:, using:) के माध्यम से पंजीकरण करता है। NotificationCenter नामित सूचनाओं (Notification.Name) का समर्थन करता है और userInfo में कोई भी डेटा पास कर सकता है। UIKeyboardWillShowNotification, UIApplicationDidEnterBackgroundNotification — सिस्टम उदाहरण।
extension Notification.Name {
static let userDidLogin = Notification.Name("userDidLogin")
}
// प्रकाशक
NotificationCenter.default.post(
name: .userDidLogin,
object: nil,
userInfo: ["userId": "123"]
)
// सब्सक्राइबर
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 }
// सब्सक्राइबर घटना पर प्रतिक्रिया करता है
self?.loadProfile(userId: userId)
}
observers.append(observer)
}
func stopObserving() {
observers.forEach { NotificationCenter.default.removeObserver($0) }
observers.removeAll()
}
}
Combine फ्रेमवर्क — NotificationCenter का एक आधुनिक रिएक्टिव विकल्प, जो iOS 13 में पेश किया गया। Publisher (NotificationCenter, URLSession, Timer) — प्रकाशक, Subscriber (sink, assign) — सब्सक्राइबर। Combine डेटा स्ट्रीम ट्रांसफॉर्मेशन के लिए ऑपरेटर (map, filter, combineLatest) जोड़ता है। @Published — एक प्रॉपर्टी रैपर जो स्वचालित रूप से सब्सक्राइबर्स को परिवर्तनों के बारे में सूचित करता है। SwiftUI के साथ MVVM में, Combine ViewModel और View को बांधने के लिए NotificationCenter की जगह लेता है।
KVO (Key-Value Observing) — वस्तुओं के व्यक्तिगत गुणों का निरीक्षण करने के लिए एक पुराना ObjC/Swift तंत्र। @objc dynamic var name: String — एक देखने योग्य गुण। observe(.name) — सदस्यता। KVO केवल @objc-संगत वर्गों और ObjC विरासत के साथ काम करता है। Apple नए प्रोजेक्ट्स में KVO के बजाय Combine और @Published की सिफारिश करता है। KVO हाइब्रिड प्रोजेक्ट्स में UIKit संगतता के लिए प्रासंगिक बना हुआ है।
LiveData — Observer को लागू करने के लिए Android Architecture Components का एक घटक। एक देखने योग्य वर्ग जो सब्सक्राइबर्स को डेटा परिवर्तनों के बारे में सूचित करता है। LiveData जीवनचक्र-जागरूक है: सब्सक्राइबर्स (LifecycleOwner) नष्ट होने पर स्वचालित रूप से सदस्यता रद्द कर देते हैं। LiveData Push मॉडल का उपयोग करता है: डेटा observe() में पास किया जाता है। Jetpack Compose से पहले Android में LiveData MVVM का मूलभूत निर्माण खंड है।
// ViewModel — प्रकाशक
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 — सब्सक्राइबर
class UserFragment : Fragment() {
private val viewModel: UserViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel.user.observe(viewLifecycleOwner) { user ->
// सब्सक्राइबर परिवर्तनों पर प्रतिक्रिया करता है
userName.text = user?.name
userEmail.text = user?.email
}
}
}
StateFlow और SharedFlow — Kotlin Coroutines के रिएक्टिव प्रकार जिन्होंने Jetpack Compose में LiveData को बदल दिया। StateFlow — एक निश्चित वर्तमान मान के साथ देखने योग्य स्थिति धारक। SharedFlow — बिना स्थिति के एक कॉन्फ़िगर करने योग्य हॉट फ्लो, एक बार की घटनाओं (नेविगेशन, टोस्ट) के लिए उपयुक्त। दोनों प्रकार Compose के साथ कसकर एकीकृत हैं: collectAsState(), collectAsEffect()। Compose के साथ आधुनिक Android प्रोजेक्ट्स में StateFlow अनिवार्य है।
LiveData बनाम StateFlow — LiveData Android Lifecycle से बंधा है, StateFlow प्लेटफ़ॉर्म-स्वतंत्र है। StateFlow coroutines, ऑपरेटर (map, filter) का समर्थन करता है और Android निर्भरताओं के बिना परीक्षण किया जा सकता है। LiveData Java संगतता के लिए सरल है। Google Kotlin + Compose पर नए प्रोजेक्ट्स के लिए StateFlow की सिफारिश करता है, और पुराने प्रोजेक्ट्स या Java कोड के लिए LiveData की।
मेमोरी लीक — उचित सब्सक्रिप्शन प्रबंधन के बिना Observer की मुख्य समस्या। यदि कोई सब्सक्राइबर (Activity, Fragment, UIViewController) नष्ट हो जाता है लेकिन सदस्यता रद्द नहीं की जाती है, तो प्रकाशक उसका संदर्भ बनाए रखता है और कचरा संग्रहकर्ता मेमोरी को मुक्त नहीं कर सकता। Android में, LifecycleOwner (Activity/Fragment) को removeObserver() कॉल करना चाहिए या observe(viewLifecycleOwner) का उपयोग करना चाहिए। iOS में — deinit में removeObserver या Combine में disposeBag।
| प्लेटफ़ॉर्म | Observer तंत्र | स्वचालित सदस्यता रद्द | मैन्युअल सदस्यता रद्द |
|---|---|---|---|
| iOS | NotificationCenter | नहीं | deinit में removeObserver() |
| iOS | Combine (sink) | नहीं | store(in: &bag) — DisposeBag |
| iOS | KVO | नहीं | deinit में removeObserver() |
| Android | LiveData | हाँ (LifecycleOwner) | removeObserver() वैकल्पिक |
| Android | StateFlow | viewModelScope के माध्यम से | सदस्यता रद्द करने पर cancel() Job |
| Android | RxJava | नहीं | CompositeDisposable में dispose() |
सब्सक्राइबर्स में कमजोर संदर्भ — सब्सक्रिप्शन ब्लॉक में क्लोजर का उपयोग करते समय, Swift में [weak self] का उपयोग करें और Kotlin में जीवनचक्र दायरे का संदर्भ लें। LiveData LifecycleOwner के माध्यम से सब्सक्रिप्शन को स्वचालित रूप से प्रबंधित करता है — सब्सक्रिप्शन तभी सक्रिय होता है जब Lifecycle STARTED या RESUMED अवस्था में हो। Compose में StateFlow जीवनचक्र-जागरूकता के साथ collectAsState() का उपयोग करता है। iOS में NotificationCenter को स्पष्ट [weak self] की आवश्यकता होती है क्योंकि क्लोजर self का मजबूत संदर्भ रखता है।
Observer (GoF) और प्रकाशक-सब्सक्राइबर (PubSub) — समान लेकिन अलग पैटर्न। Observer में, प्रकाशक सीधे सब्सक्राइबर्स को उनकी विधियों को कॉल करके सूचित करता है। प्रकाशक सब्सक्राइबर्स के बारे में जानता है (एक सूची संग्रहीत करता है)। PubSub में, प्रकाशक और सब्सक्राइबर एक दूसरे को नहीं जानते — उनके बीच एक मध्यस्थ (Event Bus, Message Queue, NotificationCenter) होता है। प्रकाशक एक चैनल पर संदेश भेजता है, सब्सक्राइबर चैनल सुनता है। PubSub में ढीला युग्मन होता है।
मोबाइल डेवलपमेंट में PubSub के उदाहरण — iOS में NotificationCenter को PubSub माना जा सकता है: प्रकाशक सब्सक्राइबर्स को नहीं जानता — वह केवल एक सूचना पोस्ट करता है। Android में EventBus या Otto (पुराने)। BroadcastChannel के साथ SharedFlow — Kotlin दुनिया में PubSub। वितरित सिस्टम में, PubSub RabbitMQ, Kafka, Google PubSub के माध्यम से लागू किया जाता है। मोबाइल डेवलपमेंट के लिए, PubSub मॉड्यूलर आर्किटेक्चर में उपयोगी है जहाँ मॉड्यूल एक दूसरे पर निर्भर नहीं होने चाहिए।
क्या चुनें — UI अपडेट (ViewModel → View) के लिए, Observer का उपयोग करें (LiveData, StateFlow, @Published)। क्रॉस-मॉड्यूल घटनाओं (प्रमाणीकरण, लॉगआउट, थीम बदलना) के लिए — PubSub (SharedFlow, NotificationCenter, EventBus)। Observer एक स्क्रीन के भीतर सरल और अधिक कुशल है, PubSub वैश्विक घटनाओं के लिए अधिक लचीला है लेकिन अंतर्निहित निर्भरताओं के कारण डीबग करना कठिन है।
अक्सर पूछे जाने वाले प्रश्न
StateFlow Kotlin Coroutines का एक प्लेटफ़ॉर्म-स्वतंत्र प्रकार है, जबकि LiveData Android Lifecycle से बंधा है। StateFlow coroutines और ऑपरेटरों का समर्थन करता है, और Android के बिना परीक्षण किया जा सकता है। LiveData LifecycleOwner के माध्यम से स्वचालित रूप से सब्सक्रिप्शन प्रबंधित करता है। Google Kotlin + Compose पर नए प्रोजेक्ट्स के लिए StateFlow और Java संगतता के लिए LiveData की सिफारिश करता है।
हैंडलर क्लोजर में [weak self] का उपयोग करें और deinit में removeObserver() कॉल करें। observer (NSObjectProtocol) का संदर्भ संग्रहीत करें और ऑब्जेक्ट नष्ट होने पर इसे हटाएँ। Combine में, DisposeBag जारी होने पर स्वचालित सदस्यता रद्द करने के लिए AnyCancellable और store(in:) का उपयोग करें।
हाँ, SwiftUI @Published और @StateObject/@ObservedObject के साथ ObservableObject का समर्थन करता है — यह Observer का अंतर्निहित कार्यान्वयन है। @Published स्वचालित रूप से View को परिवर्तनों के बारे में सूचित करता है। Combine आवश्यक नहीं है: ObservableObject SwiftUI में निर्मित objectWillChange Publisher का उपयोग करता है। Combine स्ट्रीम ट्रांसफॉर्मेशन के लिए ऑपरेटर जोड़ता है।
SharedFlow — एक बार की घटनाओं (नेविगेशन, टोस्ट, Snackbar) के लिए जहाँ वर्तमान मान की आवश्यकता नहीं है। StateFlow — UI स्थिति (डेटा सूची, लोडिंग प्रगति) के लिए जहाँ वर्तमान स्नैपशॉट की आवश्यकता है। SharedFlow में value गुण नहीं है और यह नए सब्सक्राइबर्स को अंतिम मान वापस नहीं करता है।
KVO एक पुराना ObjC तंत्र है, जिसके लिए @objc dynamic की आवश्यकता होती है और यह केवल NSObject से विरासत में मिले वर्गों के साथ काम करता है। Combine एक आधुनिक Swift फ्रेमवर्क है, टाइप-सेफ, ऑपरेटरों और SwiftUI एकीकरण के साथ। Combine KVO और NotificationCenter की जगह लेता है। Apple नए प्रोजेक्ट्स के लिए Combine की सिफारिश करता है, KVO केवल पुराने समर्थन के लिए।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें