Swift में एसिंक्रोनस प्रोग्रामिंग: शुरुआती लोगों के लिए पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Swift में एसिंक्रोनस प्रोग्रामिंग का परिचय

\n\n

आधुनिक मोबाइल एप्लिकेशन शायद ही कभी नेटवर्क अनुरोधों, डेटाबेस के साथ काम करने या बड़ी फ़ाइलों को प्रोसेस करने के बिना चलते हैं। इन सभी ऑपरेशनों में समय लगता है, और यदि उन्हें मुख्य थ्रेड में निष्पादित किया जाता है, तो एप्लिकेशन का इंटरफ़ेस "फ्रीज़" हो जाएगा, और उपयोगकर्ता को एक अप्रिय अनुभव मिलेगा। यहीं पर एसिंक्रोनस प्रोग्रामिंग मदद के लिए आती है।

\n\n

Swift 5.5 के आने से पहले, डेवलपर्स क्लोजर (completion handlers) या तृतीय-पक्ष लाइब्रेरी (Combine, RxSwift) का उपयोग करते थे, जो अक्सर "कॉलबैक नरक" और पढ़ने में कठिन कोड की ओर ले जाता था। नए Swift Concurrency मॉडल (async/await) के आने के साथ, एसिंक्रोनस कोड लिखना सिंक्रोनस कोड जितना ही सरल और रैखिक हो गया है।

\n\n

इस गाइड में, हम व्यावहारिक उदाहरणों के साथ Swift में एसिंक्रोनस प्रोग्रामिंग की प्रमुख अवधारणाओं को समझेंगे। आप सीखेंगे कि iOS और macOS के लिए तेज़ और रिस्पॉन्सिव एप्लिकेशन बनाने के लिए async/await, Task, Actor और अन्य टूल का उपयोग कैसे करें।

\n\n

Swift Concurrency की मुख्य अवधारणाएँ

\n\n

1. Async और Await: एसिंक्रोनसिटी का आधार

\n\n

कीवर्ड async और await नए मॉडल का हृदय हैं। async एक फ़ंक्शन को एसिंक्रोनस घोषित करता है, और await थ्रेड को ब्लॉक किए बिना परिणाम प्राप्त होने तक निष्पादन को रोकता है।

\n\n

एक सरल उदाहरण देखें: नेटवर्क से डेटा लोड करना।

\n\n
import Foundation\n\n// एसिंक्रोनस फ़ंक्शन घोषित करना\nfunc fetchUserData() async throws -> String {\n    let url = URL(string: "https://api.example.com/user/1")!\n    let (data, _) = try await URLSession.shared.data(from: url)\n    return String(data: data, encoding: .utf8) ?? "त्रुटि"\n}\n\n// एसिंक्रोनस फ़ंक्शन को कॉल करना\nTask {\n    do {\n        let userData = try await fetchUserData()\n        print("उपयोगकर्ता डेटा: \\(userData)")\n    } catch {\n        print("लोड करने में त्रुटि: \\(error.localizedDescription)")\n    }\n}
\n\n

ध्यान दें: try await का अर्थ है कि हम एक ऐसे परिणाम की प्रतीक्षा कर रहे हैं जो त्रुटि फेंक सकता है। कोड सामान्य सिंक्रोनस कोड जैसा दिखता है, लेकिन यह मुख्य थ्रेड को ब्लॉक नहीं करता है।

\n\n

2. Task: एसिंक्रोनस दुनिया का प्रवेश बिंदु

\n\n

एसिंक्रोनस फ़ंक्शन को केवल दूसरे एसिंक्रोनस कॉन्टेक्स्ट से ही कॉल किया जा सकता है। सिंक्रोनस कोड (जैसे viewDidLoad()) से एसिंक्रोनस ऑपरेशन शुरू करने के लिए Task का उपयोग किया जाता है।

\n\n
class ViewController: UIViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // एसिंक्रोनस टास्क शुरू करना\n        Task {\n            let data = await loadData()\n            updateUI(with: data)\n        }\n    }\n    \n    func loadData() async -> String {\n        // लंबी लोडिंग का अनुकरण\n        try? await Task.sleep(nanoseconds: 2_000_000_000)\n        return "लोड किया गया डेटा"\n    }\n    \n    func updateUI(with data: String) {\n        print("UI अपडेट कर रहे हैं: \\(data)")\n    }\n}
\n\n

महत्वपूर्ण: Task एक नया एसिंक्रोनस टास्क बनाता है जो बैकग्राउंड थ्रेड में निष्पादित होता है। UI को अपडेट करने के लिए, मुख्य थ्रेड पर वापस आना सुनिश्चित करें — डिफ़ॉल्ट रूप से await यह स्वचालित रूप से करता है।

\n\n

3. Actor: डेटा रेस से सुरक्षा

\n\n

मल्टीथ्रेडिंग के साथ काम करते समय, अक्सर डेटा रेस (data race) की समस्या उत्पन्न होती है, जब कई थ्रेड एक साथ एक वेरिएबल को बदलते हैं। Swift एक सुरुचिपूर्ण समाधान प्रदान करता है — Actor।

\n\n

Actor एक रेफरेंस टाइप है जो गारंटी देता है कि किसी भी समय केवल एक थ्रेड ही इसकी म्यूटेबल स्थिति तक पहुँच सकता है।

\n\n
actor Counter {\n    private var value = 0\n    \n    func increment() {\n        value += 1\n    }\n    \n    func getValue() -> Int {\n        return value\n    }\n}\n\n// उपयोग\nlet counter = Counter                

ब्लॉग

पुस्तक अनुशंसाएँ