Swift में कार्य कतारों का परिचय
\n\nआधुनिक मोबाइल और डेस्कटॉप एप्लिकेशन तेज़ और उत्तरदायी होने चाहिए। यदि आप मुख्य थ्रेड में भारी गणना करते हैं या नेटवर्क से डेटा लोड करते हैं, तो आपका एप्लिकेशन हैंग हो जाएगा, और उपयोगकर्ता इसे बंद कर देगा। समाधान — कार्य कतारें (queues) हैं।
\n\nSwift (iOS/macOS) में, एसिंक्रोनस प्रबंधन तीन मुख्य तकनीकों पर आधारित है: Grand Central Dispatch (GCD), Operation Queue और आधुनिक सिंटैक्स async/await। इस लेख में, हम शुरू से प्रत्येक को समझेंगे, कोड उदाहरण दिखाएंगे और समझाएंगे कि कब क्या उपयोग करना है।
\n\n1. Grand Central Dispatch (GCD) और DispatchQueue
\n\nGCD, कोड के समानांतर निष्पादन को प्रबंधित करने के लिए Apple की निम्न-स्तरीय लाइब्रेरी है। मुख्य तत्व DispatchQueue है। कतार कार्यों (क्लोज़र) को उनके जोड़ने के क्रम में निष्पादित करती है।
कतारों के प्रकार
\n\n- \n
- Main Queue — मुख्य थ्रेड की अनुक्रमिक कतार। UI को अपडेट करने के लिए उपयोग किया जाता है। \n
- Global Queues — विभिन्न प्राथमिकताओं (QoS:
.userInteractive,.userInitiated,.utility,.background) के साथ समानांतर कतारें। \n - Custom Queues — आपकी अपनी कतारें (अनुक्रमिक या समानांतर)। \n
उदाहरण: बैकग्राउंड में कार्य निष्पादित करना
\n\nimport Foundation\n\n// बैकग्राउंड कतार में एसिंक्रोनस रूप से\nDispatchQueue.global(qos: .background).async {\n // भारी कार्य (लोडिंग, डेटा प्रोसेसिंग)\n let result = performHeavyTask()\n \n // परिणाम मुख्य थ्रेड पर वापस लाएं\n DispatchQueue.main.async {\n updateUI(with: result)\n }\n}\n\nfunc performHeavyTask() -> String {\n Thread.sleep(forTimeInterval: 2) // कार्य का अनुकरण\n return "हो गया!"\n}\n\nfunc updateUI(with text: String) {\n print("UI अपडेट किया गया: \\(text)")\n}\n\nध्यान दें: .async कॉल करने वाले थ्रेड को ब्लॉक नहीं करता है। यदि परिणाम की प्रतीक्षा करनी है, तो .sync का उपयोग करें (लेकिन मुख्य थ्रेड से .sync को कभी न कॉल करें — डेडलॉक होगा)।
उदाहरण: अनुक्रमिक कतार
\n\nlet serialQueue = DispatchQueue(label: "com.example.serial")\n\nserialQueue.async {\n print("कार्य 1")\n}\nserialQueue.async {\n print("कार्य 2")\n}\n// आउटपुट: कार्य 1, फिर कार्य 2\n\n2. Operation Queue — अधिक लचीला दृष्टिकोण
\n\nOperationQueue, GCD के ऊपर एक रैपर है जो ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस प्रदान करता है। आप Operation (या BlockOperation) बनाते हैं, निर्भरताएँ सेट करते हैं और कतार में जोड़ते हैं।
GCD पर लाभ
\n\n- \n
- कार्यों को रद्द करना (
cancel()) \n - कार्यों के बीच निर्भरताएँ \n
- स्थिति की निगरानी (isReady, isExecuting, isFinished) \n
- समानांतर संचालन की अधिकतम संख्या \n
उदाहरण: मूल उपयोग
\n\nlet operationQueue = OperationQueue()\noperationQueue.maxConcurrentOperationCount = 2 // एक साथ अधिकतम 2 कार्य\n\nlet operation1 = BlockOperation {\n print("डेटा लोड हो रहा है...")\n Thread.sleep(forTimeInterval: 1)\n}\n\nlet operation2 = BlockOperation {\n print("डेटा प्रोसेस हो रहा है...")\n Thread.sleep(forTimeInterval: 1)\n}\n\n// operation2, operation1 के पूरा होने के बाद ही शुरू होगा\noperation2.addDependency(operation1)\n\noperationQueue.addOperations([operation1, operation2], waitUntilFinished: false)\n\nउदाहरण: संचालन रद्द करना
\n\nlet cancelableOp = BlockOperation {\n if !cancelableOp.isCancelled {\n print("महत्वपूर्ण कार्य कर रहा हूँ")\n }\n}\n\noperationQueue.addOperation(cancelableOp)\n\n// कुछ समय बाद रद्द करें\nDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {\n cancelableOp.cancel()\n print("संचालन रद्द कर दिया गया")\n}