Combine, Apple का एक रिएक्टिव प्रोग्रामिंग फ्रेमवर्क है, जिसे iOS 13 में पेश किया गया था। Apple Documentation, 2025 के अनुसार, Combine एसिंक्रोनस इवेंट्स को संभालने के लिए एक एकीकृत घोषणात्मक API प्रदान करता है। Publisher डेटा स्रोत को परिभाषित करता है, और Subscriber उसे प्राप्त करने के लिए सब्सक्राइब करता है।
मुख्य बातें
Combine समय के साथ एसिंक्रोनस इवेंट्स को संसाधित करने के लिए एक घोषणात्मक Swift फ्रेमवर्क है। कॉलबैक-आधारित दृष्टिकोणों के विपरीत, Combine ऑपरेटरों की एक श्रृंखला के माध्यम से डेटा प्रोसेसिंग पाइपलाइनों का वर्णन करने की अनुमति देता है। फ्रेमवर्क Foundation (URLSession, Timer, NotificationCenter) और SwiftUI (ObservableObject, @Published) के साथ एकीकृत है।
कोई भी प्रकार जो Publisher प्रोटोकॉल को लागू करता है, उसे Output (मान प्रकार) और Failure (त्रुटि प्रकार) परिभाषित करना होगा। Publisher सब्सक्राइब होने तक सक्रिय नहीं होता है — यह subscribe कॉल करने के बाद ही इवेंट उत्सर्जित करना शुरू करता है। यह कोल्ड सेमैंटिक्स है, जो रिएक्टिव स्ट्रीम की विशेषता है, दक्षता में सुधार करता है।
Subscriber तीन विधियों के माध्यम से इवेंट प्राप्त करता है: receive(subscription:) — डिमांड प्रबंधन के साथ सब्सक्रिप्शन की पुष्टि; receive(_:) — एक नया मान प्राप्त करना; receive(completion:) — सफलता या त्रुटि के साथ स्ट्रीम का समापन। Demand यह निर्दिष्ट करता है कि Subscriber कितने मान स्वीकार करने को तैयार है — यह बैकप्रेशर तंत्र है।
Apple कई अंतर्निहित Publisher प्रदान करता है: Just एक मान उत्सर्जित करता है और समाप्त हो जाता है, Future — एक क्लोजर के साथ एसिंक्रोनस परिणाम, Deferred — सब्सक्रिप्शन के क्षण तक Publisher का विलंबित निर्माण। URLSession.dataTaskPublisher नेटवर्क अनुरोध को रिएक्टिव स्ट्रीम में बदल देता है। Timer.publish एक आवधिक टाइमर बनाता है। NotificationCenter.default.publisher सूचनाओं को Publisher में बदल देता है। ये एकीकरण मैन्युअल ब्रिजिंग के बिना इवेंट्स की सब्सक्राइब करने की अनुमति देते हैं।
Combine में, Publisher और Subscriber Subscription प्रोटोकॉल के माध्यम से जुड़े होते हैं। Subscription एक कनेक्टिंग ऑब्जेक्ट है जो डेटा प्रवाह को नियंत्रित करता है। डेवलपर्स को अपने स्वयं के Publisher प्रकार बनाने की आवश्यकता नहीं है — Apple अंतर्निहित प्रकार प्रदान करता है: Just, Future, Deferred, Fail, Empty, साथ ही URLSession और Timer के लिए Publisher।
Subject एक Publisher है जिसमें मैन्युअल रूप से मान भेजे जा सकते हैं। PassthroughSubject स्थिति संग्रहीत नहीं करता है: एक सब्सक्राइबर केवल उन इवेंट्स को प्राप्त करता है जो सब्सक्रिप्शन के बाद हुए। CurrentValueSubject, RxSwift में BehaviorRelay के समान, वर्तमान मान संग्रहीत करता है और इसे तुरंत नए सब्सक्राइबर्स को भेजता है।
Combine में बैकप्रेशर तंत्र डेटा स्थानांतरण गति को नियंत्रित करता है। Subscriber subscription.request(.unlimited) या subscription.request(.max(N)) के माध्यम से Publisher को बताता है कि वह कितने मान संसाधित करने को तैयार है। यह उत्पादक और उपभोक्ता गति के असमान होने पर बफर ओवरफ्लो को रोकता है।
Combine में 100 से अधिक ऑपरेटर शामिल हैं, जो श्रेणियों में विभाजित हैं: परिवर्तन (map, tryMap, flatMap), फ़िल्टरिंग (filter, compactMap, removeDuplicates), संयोजन (combineLatest, merge, zip), समय प्रबंधन (debounce, throttle, delay), और त्रुटि प्रबंधन (catch, replaceError, retry)।
combineLatest ऑपरेटर दो Publisher के नवीनतम मानों को जोड़ता है — हर बार जब कोई एक नया मान उत्सर्जित करता है, क्लोजर दोनों अद्यतन मानों के साथ कॉल किया जाता है। यह ऑपरेटर फॉर्म सत्यापन के लिए अपरिहार्य है जहाँ आपको एक साथ कई इनपुट फ़ील्ड की स्थिति को ट्रैक करने की आवश्यकता होती है।
debounce ऑपरेटर मान प्रकाशन में तब तक देरी करता है जब तक कि नए इवेंट के बिना निर्दिष्ट अंतराल न बीत जाए। यह खोज फ़ील्ड के लिए महत्वपूर्ण है: सर्वर अनुरोध तब भेजा जाता है जब उपयोगकर्ता 300–500 ms तक टाइप करना बंद कर देता है, जिससे लोड 5–10 गुना कम हो जाता है।
Combine ऑपरेटर स्तर पर त्रुटि प्रबंधन की कई रणनीतियाँ प्रदान करता है। catch Failure को इंटरसेप्ट करता है और Publisher को एक फ़ॉलबैक से बदल देता है — स्ट्रीम बिना क्रैश हुए जारी रहती है। replaceError(with:) त्रुटि के बजाय एक डिफ़ॉल्ट मान प्रदान करता है। retry(_:) विफलता पर निर्दिष्ट संख्या में सब्सक्रिप्शन का पुनः प्रयास करता है। महत्वपूर्ण: Publisher हस्ताक्षर में Never त्रुटि प्रकार गारंटी देता है कि स्ट्रीम कभी त्रुटि के साथ समाप्त नहीं होगी — यह SwiftUI में Failure प्रबंधन के बिना Publisher का उपयोग करने की अनुमति देता है।
पहला उदाहरण Just का मूल उपयोग दिखाता है — एक Publisher जो एक मान उत्सर्जित करता है और समाप्त हो जाता है:
let publisher = Just("Hello Combine")
publisher
.sink(receiveCompletion: { completion in
print("पूर्ण: \(completion)")
}, receiveValue: { value in
print("प्राप्त: \(value)")
})
दूसरा उदाहरण मुख्य थ्रेड पर परिणाम प्रसंस्करण के साथ नेटवर्क अनुरोध के लिए Combine के URLSession के साथ एकीकरण प्रदर्शित करता है:
let url = URL(string: "https://api.example.com")!
URLSession.shared
.dataTaskPublisher(for: url)
.map { $0.data }
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { completion in
if case .failure(let error) = completion {
print("त्रुटि: \(error)")
}
}, receiveValue: { data in
print("प्राप्त डेटा: \(data.count)")
})
तीसरा उदाहरण स्थिति प्रबंधन के लिए CurrentValueSubject का उपयोग दिखाता है:
let counter = CurrentValueSubject<Int, Never>(0)
counter
.sink { value in
print("काउंटर: \(value)")
}
counter.send(1) // प्रिंट करता है: काउंटर: 1
counter.send(2) // प्रिंट करता है: काउंटर: 2
print(counter.value) // प्रिंट करता है: 2
Combine और RxSwift एक ही समस्या — रिएक्टिव प्रोग्रामिंग — को हल करते हैं, लेकिन विभिन्न दृष्टिकोणों के साथ। Combine एक मूल Apple फ्रेमवर्क है जो सिस्टम में निर्मित है: कोई निर्भरता स्थापना की आवश्यकता नहीं, SwiftUI और Foundation के साथ एकीकृत। RxSwift iOS 9+ के समर्थन और ऑपरेटरों के व्यापक सेट वाली एक तृतीय-पक्ष लाइब्रेरी है।
मूल C कार्यान्वयन के कारण सामान्य परिदृश्यों में Combine का प्रदर्शन अधिक है। RxSwift अधिक डीबगिंग टूल (RxSwift.Resources.total, Debug) प्रदान करता है, लेकिन इसकी ऑब्जेक्ट-ओरिएंटेड आर्किटेक्चर बड़े डेटा स्ट्रीम पर कम कुशल हो सकती है। उनके बीच चुनाव क्षमताओं और एकीकरण के बीच एक समझौता है।
एक महत्वपूर्ण अंतर बैकप्रेशर मॉडल है। Combine में, Subscriber Subscription के माध्यम से डिमांड का प्रबंधन करता है, स्ट्रीम गति पर स्पष्ट नियंत्रण देता है। RxSwift में, बैकप्रेशर डिफ़ॉल्ट रूप से नियंत्रित नहीं होता है — Observable सभी मान उत्सर्जित करता है, और Subscriber उन्हें आने पर संसाधित करता है। बड़े डेटा स्ट्रीम के लिए, Combine अधिक पूर्वानुमानित और मेमोरी-सुरक्षित है।
Combine भाषा स्तर पर SwiftUI के साथ गहराई से एकीकृत है। @Published एक Publisher उत्पन्न करता है, ObservableObject objectWillChange Publisher प्रदान करता है। SwiftUI View स्वचालित रूप से इन Publisher की सब्सक्राइब करती है और परिवर्तनों पर पुनः ड्रा करती है। UIKit के लिए CombineCocoa जैसे तृतीय-पक्ष रैपर हैं, लेकिन Combine मूल रूप से SwiftUI के लिए डिज़ाइन किया गया था, इसलिए UIKit में इसके एकीकरण के लिए अतिरिक्त कोड की आवश्यकता है। RxSwift, दूसरी ओर, UIKit के लिए एक समृद्ध पारिस्थितिकी तंत्र है: RxCocoa सभी UI तत्वों के लिए रिएक्टिव रैपर प्रदान करता है।
Combine Core Data के साथ NSFetchedResultsController Publisher के माध्यम से एकीकरण का समर्थन करता है। Publisher Core Data स्टैक में प्रत्येक परिवर्तन पर नया डेटा उत्सर्जित करता है: रिकॉर्ड जोड़ना, हटाना, अद्यतन करना। यह मैन्युअल रूप से reloadData कॉल किए बिना रिएक्टिव सूचियाँ बनाने की अनुमति देता है। Combine को UIApplication.willResignActiveNotification के लिए NotificationCenter Publisher के साथ जोड़कर, डेवलपर्स बिना डेलीगेट और कॉलबैक के पूरे एप्लिकेशन जीवनचक्र के लिए एक रिएक्टिव परत बनाते हैं। ObservableObject वर्गों के लिए, SwiftUI @Published गुणों के बदलने पर स्वचालित रूप से View को अपडेट करता है — Combine बिना मैन्युअल कोड की एक पंक्ति के पूरी श्रृंखला को संभालता है। Combine कोड का यूनिट परीक्षण ImmediateScheduler के माध्यम से Scheduler अलगाव के साथ परीक्षण मामलों में XCTestExpectation और Publisher.sink के माध्यम से किया जाता है।
UIKit परियोजनाओं में Combine के साथ काम करते समय, डेवलपर्स अक्सर sink के माध्यम से सब्सक्राइब करते हैं और AnyCancellable को Set में संग्रहीत करते हैं। सामान्य पैटर्न: ViewController एक दृश्य बनाता है, cancellables संग्रहीत करता है, ViewModel से Publisher की सब्सक्राइब करता है। deinit पर, Cancellables संग्रह के माध्यम से सभी सब्सक्रिप्शन स्वचालित रूप से रद्द हो जाते हैं। Combine में UIControl के उचित संचालन के लिए, publisher(for:) एक्सटेंशन के माध्यम से UIControl.Event Publisher का उपयोग किया जा सकता है।
Combine डीबगिंग print() या handleEvents() ऑपरेटर के माध्यम से की जाती है। print(String) सभी इवेंट लॉग करता है: receive subscription, request demand, receive value, receive completion। handleEvents अधिक सूक्ष्म नियंत्रण प्रदान करता है: Publisher जीवनचक्र के प्रत्येक चरण के लिए क्लोजर निर्दिष्ट किए जा सकते हैं। परीक्षण के लिए, CombineExpectations — एक लाइब्रेरी है जो वर्चुअल टाइम और डिमांड नियंत्रण के साथ परीक्षणों में Publisher द्वारा अपेक्षित मान उत्सर्जित करने की जाँच करने की अनुमति देती है।
Combine SwiftUI में फॉर्म प्रबंधन के लिए सक्रिय रूप से उपयोग किया जाता है: प्रत्येक @Published गुण एक Publisher उत्पन्न करता है, SwiftUI View.body के माध्यम से उसकी सब्सक्राइब करता है। combineLatest के माध्यम से कई Publisher को जोड़कर, फॉर्म सत्यापन घोषणात्मक हो जाता है: प्रत्येक Publisher एक फ़ील्ड को ट्रैक करता है, combineLatest सभी मान एकत्र करता है, map उन्हें सत्यापित करता है और Submit बटन की स्थिति लौटाता है। Publishers.Merge एक ही प्रकार के कई Publisher को एक में जोड़ता है — विभिन्न नियंत्रणों से इवेंट को एक स्ट्रीम में एकत्र करने के लिए उपयोगी।
UIKit के साथ Combine एकीकरण के लिए, एक एक्सटेंशन के माध्यम से UIControl Publisher का उपयोग करें: button.publisher(for: .touchUpInside) एक Publisher लौटाता है जो टैप पर इवेंट उत्सर्जित करता है। CombineCocoa एक सामुदायिक लाइब्रेरी है जो सभी UIControl इवेंट, UITextView.text, UIScrollView.contentOffset के लिए Publisher प्रदान करती है। सब्सक्रिप्शन रद्द करने पर, cancellables Store deinit में साफ़ हो जाता है, यह गारंटी देता है कि कोई भी सब्सक्रिप्शन अपने मालिक से अधिक जीवित नहीं रहेगा। कई स्थितियों वाले UIControl के लिए, Publisher को एक सरणी में संयोजित करने के लिए Publishers.MergeMany का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
Combine iOS 13, macOS 10.15, tvOS 13 और watchOS 6 से उपलब्ध है। यह पुराने संस्करणों के समर्थन की आवश्यकता वाली परियोजनाओं में इसके उपयोग को सीमित करता है। iOS 12 और उससे नीचे के लिए, RxSwift या तृतीय-पक्ष लाइब्रेरी का उपयोग किया जाता है।
PassthroughSubject स्थिति संग्रहीत नहीं करता है और नए सब्सक्राइबर्स को अंतिम मान दोबारा नहीं भेजता है — वे केवल भविष्य के इवेंट प्राप्त करते हैं। CurrentValueSubject वर्तमान मान संग्रहीत करता है और इसे तुरंत नए सब्सक्राइबर्स को भेजता है। CurrentValueSubject.value वर्तमान मान को समकालिक रूप से पढ़ने और लिखने की अनुमति देता है।
Combine SwiftUI का मूल है: @Published एक Publisher उत्पन्न करता है, ObservableObject objectWillChange Publisher का उपयोग करता है। SwiftUI View Combine पाइपलाइन के माध्यम से @ObservedObject और @StateObject की स्वचालित रूप से सब्सक्राइब करती है, गुणों के बदलने पर View को पुनः चित्रित करती है।
बैकप्रेशर डेटा स्थानांतरण गति को नियंत्रित करने का एक तंत्र है। Subscriber Subscription को बताता है कि वह कितने मान संसाधित करने को तैयार है (demand)। Publisher अनुरोध से अधिक उत्सर्जित नहीं कर सकता। यह नेटवर्क सॉकेट से बड़े डेटा स्ट्रीम के साथ काम करते समय महत्वपूर्ण है।
catch ऑपरेटर त्रुटि को इंटरसेप्ट करता है और Publisher को फ़ॉलबैक से बदल देता है। replaceError त्रुटि को डिफ़ॉल्ट मान से बदल देता है। retry त्रुटि पर निर्दिष्ट संख्या में सब्सक्रिप्शन का पुनः प्रयास करता है। Failure पर क्रैश को रोकने के लिए सभी ऑपरेटरों को subscribe से पहले रखा जाना चाहिए।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें