Swift (iOS/macOS) में Event Bus और Observer पैटर्न
iOS और macOS के तहत विकास में, अक्सर एप्लिकेशन घटकों के बीच शिथिल रूप से युग्मित इंटरैक्शन को व्यवस्थित करने की आवश्यकता होती है। Observer पैटर्न और Event Bus के माध्यम से इसका कार्यान्वयन एक लचीली और स्केलेबल आर्किटेक्चर बनाने के लिए एक शक्तिशाली उपकरण है। इस लेख में, हम Swift पर Event Bus को लागू करने का तरीका समझेंगे, इसकी तुलना Apple के अंतर्निहित तंत्र (NotificationCenter, Combine) से करेंगे, और iOS/macOS के लिए व्यावहारिक उदाहरण दिखाएंगे।
Event Bus और Observer पैटर्न क्या है?
Observer पैटर्न वस्तुओं के बीच "एक-से-अनेक" संबंध को परिभाषित करता है: जब एक वस्तु (प्रकाशक) अपनी स्थिति बदलती है, तो सभी आश्रित वस्तुएं (सब्सक्राइबर) स्वचालित रूप से इसके बारे में सूचित हो जाती हैं।
Event Bus एक केंद्रीकृत तंत्र है जो किसी भी घटक को एक दूसरे को सीधे जाने बिना घटनाओं को भेजने (प्रकाशित) और प्राप्त करने (सब्सक्राइब) करने की अनुमति देता है। यह शिथिल युग्मन (loose coupling) के सिद्धांत को लागू करता है।
Apple के पारिस्थितिकी तंत्र में पहले से ही अंतर्निहित समाधान मौजूद हैं:
- NotificationCenter — Observer का क्लासिक कार्यान्वयन, लेकिन टाइपिंग और सुरक्षा में सीमाओं के साथ।
- Combine — रिएक्टिव प्रोग्रामिंग के लिए एक आधुनिक फ्रेमवर्क, जो शक्तिशाली Publisher/Subscriber प्रदान करता है।
हालांकि, स्व-निर्मित Event Bus पूर्ण नियंत्रण देता है और इसे legacy-प्रोजेक्ट्स में आसानी से एकीकृत किया जा सकता है।
Swift पर सरल Event Bus का कार्यान्वयन
मेमोरी लीक को रोकने के लिए जेनेरिक और कमजोर संदर्भों का उपयोग करके एक सार्वभौमिक Event Bus बनाएं।
import Foundation
// घटनाओं के लिए प्रोटोकॉलprotocol Event { }
// Event Bus का कार्यान्वयनfinal class EventBus { static let shared = EventBus() private var observers = [ObjectIdentifier: [WeakObserver]]() private init() { } // घटना की सदस्यता func subscribe<T: Event>(observer: AnyObject, handler: @escaping (T) -> Void) { let id = ObjectIdentifier(T.self) let weakRef = WeakObserver(observer: observer, handler: { event in guard let castedEvent = event as? T else { return } handler(castedEvent) }) if observers[id] != nil { observers[id]?.append(weakRef) } else { observers[id] = [weakRef] } // मृत संदर्भों की सफाई cleanDeadObservers(for: id) } // घटना प्रकाशित करना func publish<T: Event>(_ event: T) { let id = ObjectIdentifier(T.self) guard let observerList = observers[id] else { return } for weakObserver in observerList { weakObserver.handler?(event) } // मुक्त की गई वस्तुओं को हटाएं cleanDeadObservers(for: id) } // सदस्यता समाप्त करना func unsubscribe(observer: AnyObject, eventType: Event.Type) { let id = ObjectIdentifier(eventType) observers[id]?.removeAll { $0.observer === observer } } private func cleanDeadObservers(for id: ObjectIdentifier) { observers[id]?.removeAll { $0.observer == nil } }}
// कमजोर संदर्भ के लिए सहायक वर्गprivate class WeakObserver { weak var observer: AnyObject? var handler: ((Event) -> Void)? init(observer: AnyObject, handler: @escaping (Event) -> Void) { self.observer = observer self.handler = handler }}उपयोग का उदाहरण
कस्टम घटनाओं को परिभाषित करें:
struct UserLoggedInEvent: Event { let userId: String let userName: String}
struct DataLoadedEvent: Event { let data: [String]}ViewController में उपयोग:
class ProfileViewController: UIViewController { override func