NSNotificationCenter addObserver Swift में: जीवंत उदाहरणों के साथ पूर्ण मार्गदर्शिका
\n\nकल्पना करें कि आप पिज़्ज़ा ऑर्डर करने के लिए एक ऐप लिख रहे हैं। उपयोगकर्ता कार्ट स्क्रीन पर "भुगतान करें" दबाता है, और कुछ सेकंड बाद दूसरी स्क्रीन — "ऑर्डर स्थिति" — को स्वचालित रूप से दिखाना चाहिए कि पिज़्ज़ा पहले से ही रास्ते में है। इन दो स्क्रीन को कैसे जोड़ें, बिना कोड को क्लोज़र और डेलिगेट्स के स्पेगेटी में बदले? उत्तर है — NSNotificationCenter (और आधुनिक Swift में बस NotificationCenter)।
यह पैटर्न iOS डेवलपमेंट में सबसे लोकप्रिय में से एक है। Stack Overflow पर प्रश्न "NSNotificationCenter addObserver in Swift" हज़ारों बार देखा जाता है, क्योंकि अनुभवी डेवलपर भी कभी-कभी सिंटैक्स, मेमोरी प्रबंधन और ऑब्ज़र्वर हटाने में भ्रमित हो जाते हैं। आइए एक बार और हमेशा के लिए समझें कि Swift में सूचनाओं का सही तरीके से उपयोग कैसे करें।
\n\nNotificationCenter क्या है और इसकी आवश्यकता क्यों है?
\n\nNotificationCenter iOS का एक अंतर्निहित तंत्र है जो "ऑब्ज़र्वर" (Observer) पैटर्न को लागू करता है। यह कुछ ऑब्जेक्ट्स (पोस्टर्स) को संदेश भेजने की अनुमति देता है, और दूसरों (ऑब्ज़र्वर्स) को इन संदेशों की सदस्यता लेने और उन पर प्रतिक्रिया देने की अनुमति देता है। मुख्य लाभ — कमजोर जुड़ाव: भेजने वाला और प्राप्त करने वाला एक दूसरे के बारे में कुछ नहीं जानते।
यह कब उपयोगी है:
\n- \n
- दूसरी स्क्रीन पर कार्रवाई के बारे में एक स्क्रीन को सूचित करना (उदाहरण: कार्ट → ऑर्डर स्थिति) \n
- सिस्टम घटनाओं पर प्रतिक्रिया (कीबोर्ड दिखाई दिया, ऐप बैकग्राउंड में चला गया) \n
- पृष्ठभूमि डेटा लोडिंग पूरी होने के बाद UI अपडेट करना \n
पुराने प्रोजेक्ट्स (Objective-C) में NSNotificationCenter का उपयोग किया जाता था, Swift में iOS 9 से इसे बस NotificationCenter कहा जाता है। इस लेख में हम आधुनिक Swift सिंटैक्स का उपयोग करेंगे।
सूचना की सदस्यता कैसे लें: addObserver
\n\nविधि addObserver सिस्टम का हृदय है। यह किसी ऑब्जेक्ट को किसी विशिष्ट सूचना के ऑब्ज़र्वर के रूप में पंजीकृत करता है। दो मुख्य तरीके हैं: सेलेक्टर के माध्यम से (क्लासिक) और ब्लॉक (क्लोज़र) के माध्यम से।
1. सेलेक्टर के साथ addObserver विधि (target-action)
\n\nयह तरीका Objective-C से आया है। आप ऑब्ज़र्वर ऑब्जेक्ट, सेलेक्टर (वह विधि जो कॉल की जाएगी), सूचना का नाम और वैकल्पिक रूप से भेजने वाला ऑब्जेक्ट निर्दिष्ट करते हैं।
\n\nimport UIKit\n\nclass OrderStatusViewController: UIViewController {\n \n override func viewDidLoad() {\n super.viewDidLoad()\n \n // भुगतान सूचना की सदस्यता लें\n NotificationCenter.default.addObserver(\n self,\n selector: #selector(didReceivePaymentNotification(_:)),\n name: Notification.Name("PaymentDidSucceed"),\n object: nil\n )\n }\n \n @objc func didReceivePaymentNotification(_ notification: Notification) {\n print("भुगतान सफल! ऑर्डर स्थिति अपडेट कर रहे हैं।")\n // यहाँ UI अपडेट करें\n }\n \n // महत्वपूर्ण: सदस्यता रद्द करना न भूलें!\n deinit {\n NotificationCenter.default.removeObserver(self)\n }\n}\n\nयहाँ क्या महत्वपूर्ण है:
\n- \n
- हैंडलर विधि को
@objcसे चिह्नित किया जाना चाहिए — यह Objective-C runtime की आवश्यकता है। \n Notificationप्रकार का पैरामीटरnotificationमेंuserInfoहोता है — अतिरिक्त डेटा वाला एक शब्दकोश। \n - यदि
object: nilपास किया जाता है, तो ऑब्ज़र्वर किसी भी भेजने वाले से सूचनाएँ प्राप्त करेगा। \n
2. क्लोज़र के साथ addObserver विधि (iOS 9+)
\n\nआधुनिक और अधिक सुरक्षित तरीका — ब्लॉक का उपयोग करना। इसे @objc की आवश्यकता नहीं है और यह बाहरी चर को कैप्चर करने की अनुमति देता है।
class PaymentManager {\n \n private var observer: NSObjectProtocol?\n \n func startObservingPayment() {\n observer = NotificationCenter.default.addObserver(\n forName: Notification.Name("PaymentDidSucceed"),\n