Swift कार्य अनुसूचक (iOS/macOS): GCD, OperationQueue और Timer
\niOS और macOS के विकास में, अतुल्यकालिक कार्यों, विलंबित निष्पादन और बहु-थ्रेडिंग का प्रबंधन एप्लिकेशन के प्रदर्शन और प्रतिक्रियाशीलता का आधार है। Swift में इसके लिए तीन प्रमुख घटकों का उपयोग किया जाता है: GCD (Grand Central Dispatch), OperationQueue और Timer। इस लेख में हम इनमें से प्रत्येक का विस्तार से विश्लेषण करेंगे, कोड उदाहरण दिखाएंगे और समझाएंगे कि कब क्या उपयोग करना चाहिए।
1. Grand Central Dispatch (GCD) — DispatchQueue
\nGCD एक निम्न-स्तरीय C-API है, जिसे Swift DispatchQueue के माध्यम से प्रदान करता है। यह कार्यों को अतुल्यकालिक रूप से, समानांतर या क्रमिक रूप से निष्पादित करने की अनुमति देता है, स्वचालित रूप से थ्रेड्स का प्रबंधन करता है।
कतारों के मुख्य प्रकार:
\n- \n
- Main Queue — क्रमिक कतार, मुख्य थ्रेड (UI) पर कार्य निष्पादित करती है। \n
- Global Queues — विभिन्न प्राथमिकताओं (background, user-initiated, utility) वाली समानांतर कतारें। \n
- Custom Serial/Concurrent Queues — डेवलपर द्वारा बनाई जाती हैं। \n
उदाहरण: अतुल्यकालिक डेटा लोडिंग
\nimport Foundation\n\n// वैश्विक पृष्ठभूमि कतार प्राप्त करें\nDispatchQueue.global(qos: .background).async {\n // भारी कार्य (पार्सिंग, डाउनलोड)\n let data = try? Data(contentsOf: URL(string: "https://example.com/data.json")!)\n \n // UI अपडेट करने के लिए मुख्य थ्रेड पर वापस आएं\n DispatchQueue.main.async {\n // इंटरफ़ेस अपडेट करें\n print("डेटा लोड हुआ: \\(data?.count ?? 0) बाइट्स")\n }\n}\n\nविलंबित निष्पादन (dispatch_after)
\nlet deadline = DispatchTime.now() + 3.0 // 3 सेकंड बाद\nDispatchQueue.main.asyncAfter(deadline: deadline) {\n print("3 सेकंड बीत गए")\n}\n\nकार्य समूह (DispatchGroup)
\nlet group = DispatchGroup()\n\ngroup.enter()\nDispatchQueue.global().async {\n // कार्य 1\n Thread.sleep(forTimeInterval: 2)\n group.leave()\n}\n\ngroup.enter()\nDispatchQueue.global().async {\n // कार्य 2\n Thread.sleep(forTimeInterval: 1)\n group.leave()\n}\n\n// सभी कार्यों के पूरा होने की सूचना\ngroup.notify(queue: .main) {\n print("सभी कार्य पूर्ण")\n}\n\n2. OperationQueue — उच्च-स्तरीय अनुसूचक
\nOperationQueue GCD के ऊपर बनाया गया है, लेकिन अधिक लचीलापन प्रदान करता है: संचालन के बीच निर्भरताएँ, प्राथमिकताएँ, व्यक्तिगत कार्यों को रद्द करना, समानांतर संचालन की अधिकतम संख्या को सीमित करना आदि सेट किया जा सकता है।
संचालन बनाना और निष्पादित करना
\nlet queue = OperationQueue()\nqueue.maxConcurrentOperationCount = 2 // अधिकतम 2 समानांतर कार्य\n\nlet operation1 = BlockOperation {\n print("संचालन 1")\n Thread.sleep(forTimeInterval: 1)\n}\n\nlet operation2 = BlockOperation {\n print("संचालन 2")\n Thread.sleep(forTimeInterval: 1)\n}\n\n// निर्भरता सेट करें: operation2 केवल operation1 के बाद शुरू होगा\noperation2.addDependency(operation1)\n\nqueue.addOperations([operation1, operation2], waitUntilFinished: false)\n\nसंचालन रद्द करना
\noperation1.cancel() // यदि संचालन अभी निष्पादित नहीं हो रहा है तो उसे रद्द करता है\n\n// संचालन के अंदर रद्दीकरण की जाँच\nlet cancellableOp = BlockOperation {\n if !cancellableOp.isCancelled {\n print("निष्पादित हो रहा हूँ")\n }\n}\n\nOperationQueue की प्रमुख विशेषताएँ:
\n- \n
qualityOfService(प्राथमिकता) सेट की जा सकती है। \n - संचालन
Operationऑब्जेक्ट हो सकते हैं जिनमेंmain()विधि को ओवरराइड किया गया हो। \n - स्थिति की निगरानी के लिए KVO (Key-Value Observing) का समर्थन करता है। \n
3. Timer — आवधिक और विलंबित कार्यों के लिए
\nTimer (पहले NSTimer) का उपयोग निश्चित अंतराल पर कोड निष्पादित करने के लिए किया जाता है। महत्वपूर्ण: टाइमर काम करते हैं