Swift (iOS/macOS) के लिए कार्य कतारें: GCD, OperationQueue और Swift Concurrency
iOS और macOS के लिए डेवलपमेंट में समानांतर कार्यों के कुशल प्रबंधन की आवश्यकता होती है। कार्य कतारें (Task Queues) उत्तरदायी और उच्च-प्रदर्शन वाले एप्लिकेशन बनाने के लिए एक मूलभूत तंत्र हैं। Swift में तीन मुख्य दृष्टिकोण हैं: क्लासिक Grand Central Dispatch (GCD), ऑब्जेक्ट-ओरिएंटेड OperationQueue और आधुनिक async/await (Swift Concurrency)। इस लेख में हम व्यावहारिक उदाहरणों के साथ प्रत्येक का विस्तार से विश्लेषण करेंगे।
1. Grand Central Dispatch (GCD) — DispatchQueue
GCD एक निम्न-स्तरीय C लाइब्रेरी है जो सिस्टम कर्नेल में निर्मित है। Swift में इसे DispatchQueue क्लास द्वारा दर्शाया गया है। यह कोड ब्लॉक को अनुक्रमिक या समवर्ती रूप से निष्पादित करने की अनुमति देता है।
मुख्य प्रकार की कतारें:
- Main Queue — मुख्य थ्रेड पर चलने वाली अनुक्रमिक कतार। UI अपडेट करने के लिए उपयोग किया जाता है।
- Global Queues — विभिन्न प्राथमिकताओं (QoS: userInteractive, userInitiated, utility, background) वाली समवर्ती कतारें।
- Custom Queues — उपयोगकर्ता-परिभाषित कतारें (अनुक्रमिक या समवर्ती)।
उदाहरण: UI अपडेट के साथ एसिंक्रोनस डेटा लोडिंग
import UIKit
class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView!
func loadImage(from url: URL) { // बैकग्राउंड कतार पर स्विच करें DispatchQueue.global(qos: .userInitiated).async { [weak self] in guard let data = try? Data(contentsOf: url), let image = UIImage(data: data) else { return }
// UI अपडेट करने के लिए मुख्य थ्रेड पर वापस आएं DispatchQueue.main.async { self?.imageView.image = image } } }}सेमाफोर और ग्रुप के साथ कार्य करना
let group = DispatchGroup()let queue = DispatchQueue.global()
group.enter()queue.async { print("कार्य 1 पूरा हुआ") group.leave()}
group.enter()queue.async { print("कार्य 2 पूरा हुआ") group.leave()}
group.notify(queue: .main) { print("सभी कार्य पूरे हो गए")}2. OperationQueue और Operation
OperationQueue GCD के ऊपर एक रैपर है जो ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस प्रदान करता है। प्रत्येक कार्य Operation क्लास (या इसके उपवर्ग BlockOperation) का एक इंस्टेंस है। मुख्य लाभ: निर्भरता प्रबंधन, कार्यों को रद्द करना और समवर्ती संचालन की अधिकतम संख्या को कॉन्फ़िगर करना।
उदाहरण: निर्भरताओं के साथ लोडिंग
let queue = OperationQueue()queue.maxConcurrentOperationCount = 2
let fetchData = BlockOperation { print("डेटा लोड हो रहा है...")}
let processData = BlockOperation { print("डेटा प्रोसेस हो रहा है...")}
let updateUI = BlockOperation { print("इंटरफ़ेस अपडेट हो रहा है")}
// निर्भरताएं सेट करें: processData fetchData के बाद निष्पादित होगाprocessData.addDependency(fetchData)updateUI.addDependency(processData)
queue.addOperations([fetchData, processData, updateUI], waitUntilFinished: false)प्राथमिकताएं और कार्यों को रद्द करना
let operation = BlockOperation { if Task.isCancelled { return } print("निष्पादित हो रहा है...")}operation.queuePriority = .veryHigh
// ऑपरेशन रद्द करेंoperation.cancel()3. Swift Concurrency (async/await)
Swift 5.5 से शुरू करके, Apple ने एक अंतर्निहित एसिंक्रोनस मॉडल पेश किया। async/await बिना क्लोजर के, रैखिक रूप से एसिंक्रोनस कोड लिखने की अनुमति देता है। मुख्य घटक: Task, TaskGroup, actor।
उदाहरण: एसिंक्रोनस इमेज लोडिंग
import UIKit
class ImageLoader { func loadImage(from url: URL) async throws -> UIImage { let