परिचय: Swift में कार्य कतारों की आवश्यकता क्यों है?
आधुनिक iOS और macOS डेवलपमेंट में, एप्लिकेशन का प्रदर्शन सीधे तौर पर इस बात पर निर्भर करता है कि आप थ्रेड्स को कितनी कुशलता से प्रबंधित करते हैं। लंबी अवधि के कार्य — नेटवर्क से डेटा लोड करना, इमेज प्रोसेसिंग, डेटाबेस के साथ काम करना — को मुख्य थ्रेड (Main Thread) को ब्लॉक नहीं करना चाहिए, जो इंटरफ़ेस के लिए जिम्मेदार है। यदि मुख्य थ्रेड व्यस्त है, तो उपयोगकर्ता को "फ्रीज़" स्क्रीन दिखाई देती है, और सिस्टम जबरन एप्लिकेशन को बंद कर सकता है।
कार्य कतारें (Task Queues) इस समस्या का समाधान करती हैं। वे कोड को एसिंक्रोनस रूप से, समानांतर या क्रमिक रूप से निष्पादित करने की अनुमति देती हैं, बिना UI को ब्लॉक किए। Swift में इसके लिए तीन मुख्य उपकरण हैं: Grand Central Dispatch (GCD), OperationQueue और आधुनिक मॉडल async/await (Swift Concurrency)। इस लेख में, हम व्यावहारिक उदाहरणों के साथ इनका विश्लेषण करेंगे और पता लगाएंगे कि कब किसका उपयोग करना चाहिए।
1. Grand Central Dispatch (GCD): क्लासिक दृष्टिकोण
GCD एक निम्न-स्तरीय C लाइब्रेरी है जो थ्रेड पूल का प्रबंधन करती है। Swift में इसके साथ ग्लोबल कतारों (DispatchQueue) के माध्यम से काम करना सुविधाजनक है।
1.1. GCD में कतारों के मुख्य प्रकार
- Main Queue — मुख्य थ्रेड की क्रमिक कतार। UI को अपडेट करने के लिए उपयोग किया जाता है।
- Global Queues — विभिन्न प्राथमिकताओं (QoS:
.userInteractive,.userInitiated,.utility,.background) के साथ समानांतर कतारें। - Custom Queues — आपके द्वारा बनाई गई कतारें (क्रमिक या समानांतर हो सकती हैं)।
1.2. उदाहरण: बैकग्राउंड में डेटा लोड करना और UI अपडेट करना
मान लीजिए, हमें एक रिमोट सर्वर से JSON लोड करना है और परिणाम को टेबल में प्रदर्शित करना है।
DispatchQueue.global(qos: .userInitiated).async { // 1. बैकग्राउंड कार्य: डेटा लोड करना guard let url = URL(string: "https://api.example.com/data") else { return } let data = try? Data(contentsOf: url) // 2. UI अपडेट करने के लिए मुख्य थ्रेड पर वापस आना DispatchQueue.main.async { // डेटा मॉडल या टेबल को अपडेट करें self.tableView.reloadData() }}1.3. सिंक्रोनाइज़ेशन के लिए DispatchGroup का उपयोग
जब कई समानांतर कार्यों को निष्पादित करना और उनके पूरा होने की प्रतीक्षा करनी हो, तो DispatchGroup का उपयोग करें।
let group = DispatchGroup()var images: [UIImage] = []
for url in imageURLs { group.enter() DispatchQueue.global().async { if let data = try? Data(contentsOf: url), let image = UIImage(data: data) { images.append(image) } group.leave() }}
group.notify(queue: .main) { print("सभी इमेज लोड हो गईं: \\(images.count)") // UI अपडेट करें}2. OperationQueue: अमूर्तता का उच्च स्तर
OperationQueue GCD के ऊपर बनाई गई है, लेकिन अतिरिक्त सुविधाएँ प्रदान करती है: कार्यों को रद्द करना, संचालन के बीच निर्भरताएँ, समानांतर संचालन की अधिकतम संख्या पर नियंत्रण।
2.1. संचालन बनाना और चलाना
संचालन BlockOperation के माध्यम से या Operation से इनहेरिट करके बनाए जा सकते हैं।
let queue = OperationQueue()queue.maxConcurrentOperationCount = 2 // समानांतर कार्यों को 2 तक सीमित करें
let operation1 = BlockOperation { print("संचालन 1 शुरू हुआ") sleep(2) print("संचालन 1 पूरा हुआ")}
let operation2 = BlockOperation { print("संचालन 2 शुरू हुआ") sleep(1) print("संचालन 2 पूरा हुआ")}
// निर्भरता सेट करें: operation2 केवल operation1 के बाद शुरू होगाoperation2.addDependency(operation1)
queue.addOperations([operation1, operation2], waitUntilFinished: false)2.2. संचालन रद्द करना
GCD के विपरीत, संचालन को रद्द किया जा सकता है। यह महत्वपूर्ण है यदि उपयोगकर्ता स्क्रीन छोड़ देता है, और