स्विफ्ट में टास्क कतारों के साथ काम करना: सिद्धांत से वास्तविक परियोजनाओं तक
\niOS और macOS के तहत आधुनिक विकास में, इंटरफ़ेस की प्रतिक्रिया गति एप्लिकेशन की सफलता का एक महत्वपूर्ण कारक है। हर बार जब आप मुख्य थ्रेड पर कोई भारी ऑपरेशन (इमेज लोड करना, JSON पार्स करना, डेटाबेस के साथ काम करना) करते हैं, तो उपयोगकर्ता इंटरफ़ेस को "हैंग" होते हुए देखता है। समाधान टास्क कतारें हैं। इस लेख में, हम स्विफ्ट में कतारों के साथ काम करने के तीन मुख्य दृष्टिकोणों का विश्लेषण करेंगे: क्लासिक GCD, उच्च-स्तरीय OperationQueue और आधुनिक async/await। आपको उपयोग के लिए तैयार कोड उदाहरण मिलेंगे और पता चलेगा कि किसी विशिष्ट कार्य के लिए कौन सा दृष्टिकोण चुनना है।
\n\n1. Grand Central Dispatch (GCD): DispatchQueue के साथ त्वरित शुरुआत
\nGrand Central Dispatch कोड के समानांतर निष्पादन को प्रबंधित करने के लिए एक निम्न-स्तरीय लाइब्रेरी है। यह स्विफ्ट में मल्टीथ्रेडिंग का आधार है और सरल बैकग्राउंड कार्यों के लिए अभी भी सबसे कुशल उपकरण बना हुआ है।
\n\nकतारों के मुख्य प्रकार:
\n- \n
main— मुख्य थ्रेड की सीरियल कतार (सभी UI अपडेट केवल यहाँ)। \n global(qos:)— प्राथमिकताओं के साथ समानांतर कतारें (userInteractive, userInitiated, utility, background)। \n custom(label:)— आपकी अपनी कतार (सीरियल या समानांतर हो सकती है)। \n
उदाहरण: इमेज लोड करना और UI अपडेट करना
\nimport UIKit\n\nclass ImageLoader {\n func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) {\n DispatchQueue.global(qos: .userInitiated).async {\n guard let data = try? Data(contentsOf: url),\n let image = UIImage(data: data) else {\n DispatchQueue.main.async {\n completion(nil)\n }\n return\n }\n DispatchQueue.main.async {\n completion(image)\n }\n }\n }\n}\n\nव्यावहारिक सलाह: उन कार्यों के लिए हमेशा .userInitiated का उपयोग करें जिनकी उपयोगकर्ता तुरंत अपेक्षा करता है (उदाहरण के लिए, इमेज खोलना)। बैकग्राउंड डेटा सिंक्रोनाइज़ेशन के लिए .background का उपयोग करें।
2. OperationQueue: निर्भरता प्रबंधन और कार्य रद्द करना
\nजब लॉजिक अधिक जटिल हो जाता है (किसी कार्य को रद्द करना, निष्पादन क्रम निर्धारित करना या समानांतर संचालन की संख्या को सीमित करना आवश्यक होता है), तब OperationQueue मदद करता है। GCD के विपरीत, ऑपरेशन ऑब्जेक्ट होते हैं जिन्हें पुन: उपयोग और नियंत्रित किया जा सकता है।
मुख्य क्षमताएँ:
\n- \n
cancel()के माध्यम से कार्य रद्द करना। \n - निर्भरताएँ (
addDependency) — कार्य B केवल कार्य A के बाद निष्पादित होगा। \n - समानांतर संचालन की अधिकतम संख्या का नियंत्रण (
maxConcurrentOperationCount). \n
उदाहरण: समानांतरता सीमा के साथ कई इमेज डाउनलोड करना
\nimport UIKit\n\nclass BatchImageDownloader {\n private let queue: OperationQueue = {\n let q = OperationQueue()\n q.maxConcurrentOperationCount = 3 // एक साथ अधिकतम 3 डाउनलोड\n q.qualityOfService = .userInitiated\n return q\n }()\n \n func downloadImages(from urls: [URL], completion: @escaping ([UIImage]) -> Void) {\n var images: [UIImage] = []\n let syncQueue = DispatchQueue(label: "sync.images")\n \n let finishOperation = BlockOperation {\n DispatchQueue.main.async {\n completion(images)\n }\n }\n \n for url in urls {\n let operation = BlockOperation {\n guard let data = try? Data(contentsOf: url),\n let image = UIImage(data: data) else { return }\n syncQueue.async {\n images.append(image)\n }\n }\n