@Published Combine फ्रेमवर्क का एक property wrapper है जो ObservableObject प्रोटोकॉल का अनुपालन करने वाले वर्ग के गुण में परिवर्तनों को स्वचालित रूप से प्रकाशित करता है। जब @Published से चिह्नित गुण का मान बदलता है, SwiftUI objectWillChange के माध्यम से सिग्नल प्राप्त करता है और उस ऑब्जेक्ट की सदस्यता लेने वाले सभी दृश्यों को पुनः रेंडर करता है। Apple Combine Framework दस्तावेज़ीकरण (2025) के अनुसार, @Published एक Publisher उत्पन्न करता है जिसे Combine ऑपरेटरों: map, filter, debounce और अन्य के माध्यम से अतिरिक्त रूप से रूपांतरित किया जा सकता है। यह @Published को MVVM आर्किटेक्चर में डेटा और उपयोगकर्ता इंटरफ़ेस के बीच एक मुख्य पुल बनाता है।
मुख्य बिंदु
objectWillChange कॉल होता है, जो सदस्यता लिए गए दृश्यों के पुनः रेंडरिंग को ट्रिगर करता है$property के माध्यम से सुलभ — स्ट्रीम की सदस्यता लेना, संयोजन और रूपांतरण संभव@Published Combine मॉड्यूल में परिभाषित एक property wrapper है जो वर्ग के गुण में परिवर्तनों के बारे में सब्सक्राइबर्स को स्वचालित रूप से सूचित करने की क्षमता जोड़ता है। इसका उपयोग केवल एक वर्ग के अंदर (संरचना में नहीं) और केवल ObservableObject प्रोटोकॉल का अनुपालन करने वाले वर्ग के गुणों पर ही किया जा सकता है।
जब @Published गुण का मान बदलता है, Combine डॉलर उपसर्ग के माध्यम से सुलभ एक अंतर्निहित publisher के माध्यम से एक ईवेंट उत्पन्न करता है: $propertyName. यह publisher एक ObservableObjectPublisher है, जो ObservableObject का ही हिस्सा है। SwiftUI स्वचालित रूप से इसकी सदस्यता लेता है जब कोई दृश्य @ObservedObject या @StateObject का उपयोग करता है, और ऑब्जेक्ट के अंदर किसी भी @Published गुण के बदलने पर दृश्य को पुनः रेंडर करता है।
मैट न्यूबर्ग की पुस्तक “IOS 18 Programming Fundamentals with Swift” (2025) के अनुसार, @Published willSet पैटर्न पर एक सुविधाजनक आवरण है, जो स्वचालित रूप से objectWillChange.send() को कॉल करता है। वास्तव में, कंपाइलर @Published को willSet ऑब्ज़र्वर के साथ एक computed property में विस्तारित करता है, जो मैन्युअल कार्यान्वयन की तुलना में रनटाइम पर शून्य ओवरहेड प्रदान करता है।
सभी ObservableObject गुणों के लिए @Published का उपयोग करें जिनके परिवर्तन इंटरफ़ेस में प्रतिबिंबित होने चाहिए। UI को प्रभावित न करने वाले गुणों के लिए, @Published के बिना सामान्य stored properties अनावश्यक पुनः रेंडरिंग को कम करती हैं।
@Published संकलन के समय दो प्रमुख तत्व उत्पन्न करता है। पहला willSet-निरीक्षक के साथ एक संग्रहीत गुण है जो नया मान लिखने से पहले objectWillChange.send() को कॉल करता है। दूसरा प्रोजेक्शन $propertyName है, जो एक Published.Publisher लौटाता है जिसे सीधे Combine पाइपलाइनों में उपयोग किया जा सकता है।
तीन गुणों वाले Settings वर्ग पर विचार करें: दो @Published और एक सामान्य:
class Settings: ObservableObject {
@Published var username: String = "Guest"
@Published var isDarkMode = false
var lastLogin: Date = Date() // without @Published
}
जब username या isDarkMode बदलता है, SwiftUI Settings इंस्टेंस की सदस्यता लेने वाले सभी दृश्यों को पुनः रेंडर करेगा। lastLogin बदलने से पुनः रेंडरिंग ट्रिगर नहीं होगी। यदि आपको किसी सामान्य गुण में परिवर्तन के बारे में सब्सक्राइबर्स को मैन्युअल रूप से सूचित करने की आवश्यकता है, तो आप willSet निरीक्षक में objectWillChange.send() कॉल कर सकते हैं।
एक महत्वपूर्ण विवरण: @Published केवल तब परिवर्तन प्रकाशित करता है जब किसी गुण को सीधे असाइन किया जाता है। यदि गुण संदर्भ प्रकार (वर्ग) है और संदर्भ को बदले बिना इसकी आंतरिक स्थिति बदलती है, तो @Published इसका पता नहीं लगाएगा। ऐसे मामलों में, मैन्युअल ईवेंट भेजना या मान प्रकार (संरचना) पर स्विच करना आवश्यक है।
@Published Combine के साथ कसकर एकीकृत है — प्रत्येक @Published गुण स्वचालित रूप से प्रोजेक्शन $propertyName के माध्यम से सुलभ एक publisher प्रदान करता है। यह फ़िल्टरिंग, रूपांतरण, संयोजन और विलंबित मान प्रसंस्करण के लिए Combine ऑपरेटरों के उपयोग की अनुमति देता है।
एक सामान्य परिदृश्य debounce के साथ खोज है। एक इनपुट फ़ील्ड @Published गुण searchText से बंधा है, लेकिन सर्वर अनुरोध केवल 300 मिसे के ठहराव के बाद भेजा जाना चाहिए। $searchText.debounce के साथ Combine इसे एक पंक्ति में हल करता है:
class SearchViewModel: ObservableObject {
@Published var searchText = ""
@Published var results: [String] = []
private var cancellables = Set<AnyCancellable>()
init() {
setupSearchSubscription()
}
private func setupSearchSubscription() {
$searchText
.debounce(for: .milliseconds(300), scheduler: RunLoop.main)
.removeDuplicates()
.sink { [weak self] text in
self?.performSearch(text)
}
.store(in: &cancellables)
}
private func performSearch(_ text: String) { }
}
जॉन सैंडल्स के लेख (Swift by Sundell, 2024) के अनुसार, @Published को Combine के साथ संयोजित करना SwiftUI अनुप्रयोगों में रिएक्टिव पाइपलाइनों के लिए एक मानक पैटर्न है: वैलिडेशन, debounce, throttle, combineLatest, अन्य publishers के साथ मर्ज। @Published अनिवार्य UI कोड और रिएक्टिव Combine के बीच एक पुल के रूप में कार्य करता है।
iOS 17 की रिलीज़ के साथ, Apple ने @Observable मैक्रो प्रस्तुत किया, जो ObservableObject और @Published के बिना रिएक्टिविटी के लिए एक वैकल्पिक दृष्टिकोण प्रदान करता है। @Observable लिखने के बजाय पढ़ने के स्तर पर गुणों तक पहुँच को स्वचालित रूप से ट्रैक करता है, जो अधिक सटीक पुनः रेंडरिंग प्रदान करता है — केवल वह दृश्य अपडेट होता है जो किसी विशिष्ट बदले गए गुण को पढ़ता है।
हालाँकि, इसका मतलब यह नहीं है कि @Published पुराना हो गया है। @Published आवश्यक बना हुआ है जब Combine पाइपलाइन एकीकरण की आवश्यकता होती है — प्रोजेक्शन $propertyName एक publisher प्रदान करता है जो @Observable के पास नहीं है। इसके अलावा, iOS 16 और उससे नीचे के साथ पिछड़ी संगतता के लिए, @Published+ObservableObject ही एकमात्र विकल्प है। Apple WWDC 2023 सत्र “Discover Observation in SwiftUI” के अनुसार, Apple नई परियोजनाओं के लिए @Observable की अनुशंसा करता है, लेकिन मौजूदा कोड और Combine परिदृश्यों के लिए @Published के समर्थन को स्पष्ट रूप से बनाए रखता है।
व्यवहार में, कई परियोजनाएँ एक हाइब्रिड दृष्टिकोण का उपयोग करती हैं: नए डेटा मॉडल @Observable का उपयोग करते हैं, जबकि @Published के साथ मौजूदा ObservableObject बिना रिफैक्टरिंग के रहते हैं। @Published तब भी अपरिहार्य है जब प्रकाशन पर सूक्ष्म नियंत्रण की आवश्यकता होती है — उदाहरण के लिए, कई गुणों के बैच अपडेट पूरा होने तक अधिसूचना में देरी करना।
पहली गलती संरचना में @Published का उपयोग करना है। कंपाइलर एक त्रुटि देगा: “Property wrapper cannot be applied to a computed property” या “‘@Published’ is only available on members of a class.” @Published को संदर्भ शब्दार्थ की आवश्यकता है क्योंकि ObservableObjectPublisher एक वर्ग है जो प्रत्येक इंस्टेंस के लिए अद्वितीय होना चाहिए।
दूसरी गलती संदर्भ बदले बिना संदर्भ गुण की सामग्री को बदलना है। यदि @Published गुण सरणी प्रकार [String] का है और आप array.append("new") कॉल करते हैं, तो @Published परिवर्तन का पता नहीं लगाएगा क्योंकि सरणी का संदर्भ नहीं बदला है। समाधान: गुण को नया मान असाइन करें array = array + ["new"] या मैन्युअल रूप से objectWillChange.send() का उपयोग करें।
तीसरी गलती @Published गुणों की अत्यधिक संख्या है। प्रत्येक @Published गुण ObservableObject की सदस्यता लेने वाले सभी दृश्यों की पुनः रेंडरिंग ट्रिगर करता है, न कि केवल उन दृश्यों की जो उस गुण को पढ़ते हैं। Point-Free (2025) के अनुसार, एक बड़े ObservableObject को @StateObject और @EnvironmentObject के साथ कई छोटे ObservableObjects में विभाजित करने से अनावश्यक पुनः रेंडरिंग कम होती है और प्रदर्शन में सुधार होता है।
पहला उदाहरण सत्यापन के साथ पंजीकरण फ़ॉर्म का ViewModel है। @Published गुण email और password Combine पाइपलाइन के माध्यम से सत्यापन त्रुटि प्रदर्शन को ट्रिगर करते हैं:
class RegistrationViewModel: ObservableObject {
@Published var email = ""
@Published var password = ""
@Published var emailError: String?
@Published var isFormValid = false
private var cancellables = Set<AnyCancellable>()
init() {
$email
.map { $0.contains("@") ? nil : "Invalid email" }
.assign(to: &$emailError)
.store(in: &cancellables)
$email.combineLatest($password)
.map { !$0.isEmpty && !$1.isEmpty }
.assign(to: &$isFormValid)
.store(in: &cancellables)
}
}
दूसरा उदाहरण संदर्भ तत्वों के संग्रह के लिए मैन्युअल प्रकाशन है। एक तत्व के अंदर प्रत्येक परिवर्तन पर पूरी सरणी को बदलने के बजाय, objectWillChange.send() का उपयोग किया जाता है:
class TodoItem {
var title: String
var isDone = false
init(title: String) { self.title = title }
}
class TodoListViewModel: ObservableObject {
@Published var items: [TodoItem] = []
func toggle(item: TodoItem) {
item.isDone.toggle()
self.objectWillChange.send() // manual notification
}
}
तीसरा उदाहरण Combine के माध्यम से @Published गुण के लिए Assign है। Swift 5.9 के नए सिंटैक्स का उपयोग करके, आप Optional रैपर के बिना प्रोजेक्शन assign(to: &$property) के माध्यम से सीधे असाइन कर सकते हैं। सब्सक्रिप्शन बनाए बिना publisher को @Published गुण से जोड़ने का यह सबसे छोटा तरीका है।
अक्सर पूछे जाने वाले प्रश्न
नहीं, @Published का उपयोग केवल ObservableObject का अनुपालन करने वाले वर्ग के अंदर ही किया जा सकता है। संरचनाओं में, स्थानीय स्थिति के लिए @State या iOS 17+ में @Observable मैक्रो के साथ @Bindable का उपयोग करें। संरचना में @Published का उपयोग करने का प्रयास संकलन त्रुटि का कारण बनेगा।
सही दृष्टिकोण: नया मान पूरी तरह से असाइन करें (array = array + ["new"]). @Published संदर्भ प्रतिस्थापन को ट्रैक करता है, सामग्री परिवर्तन को नहीं। संदर्भ प्रकारों के संग्रह के लिए, तत्वों की आंतरिक स्थिति बदलने के बाद मैन्युअल objectWillChange.send() का उपयोग करें।
@State एकल दृश्य के अंदर स्थानीय स्थिति के लिए डिज़ाइन किया गया है और केवल मान प्रकारों के साथ काम करता है। @Published ObservableObject गुणों के लिए है जिन्हें @ObservedObject या @EnvironmentObject के माध्यम से कई दृश्यों द्वारा पढ़ा जा सकता है। @State सरल है, @Published Combine एकीकरण के कारण अधिक शक्तिशाली है।
केवल वे जिनके परिवर्तन UI को अपडेट करने चाहिए। आंतरिक गणनाओं, कैश या अस्थायी फ़्लैग के लिए गुणों को @Published की आवश्यकता नहीं है — इससे अनावश्यक पुनः रेंडरिंग कम होती है। @Published को संकेत के रूप में उपयोग करें कि “yah gun interface ke liye mahatvpurn hai.”
SwiftUI, NSManagedObject के लिए @FetchRequest और @ObservedObject के माध्यम से Core Data के साथ एकीकृत होता है। ManagedObject पहले से ही ObservableObject का अनुपालन करता है, इसलिए @Published की आवश्यकता नहीं है — NSManagedObject स्वयं परिवर्तनों की सूचना देता है। @Published का उपयोग डेटा परिवर्तन के लिए Core Data और UI के बीच ViewModel परत में किया जाता है।
सारांश
objectWillChange.send() कॉल करता है, प्रोजेक्शन $property के माध्यम से publisher उत्पन्न करता हैassign(to: &$property) publisher को सीधे @Published गुण से सब्सक्राइब करने की अनुमति देता हैहम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें