Swift में dispatch_after: GCD के अंदर की कार्यप्रणाली — उदाहरणों के साथ विश्लेषण

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

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

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

Swift में dispatch_after: GCD विलंबित कार्यों को अंदर से कैसे निष्पादित करता है

\n\n

कल्पना करें: आप Swift में एक ऐप लिख रहे हैं, और आपको कोड का एक टुकड़ा तुरंत नहीं, बल्कि, मान लीजिए, 3 सेकंड बाद निष्पादित करना है। सबसे पहले जो चीज़ दिमाग में आती है वह है dispatch_after। लेकिन अगर आप Swift के पुराने संस्करणों या Stack Overflow पर देखेंगे, तो आप पाएंगे कि यह विधि बदल गई है। और सबसे महत्वपूर्ण बात यह है कि बहुत कम लोग समझते हैं कि जब हम कहते हैं, "इसे 2 सेकंड में करो", तो Grand Central Dispatch (GCD) के अंदर वास्तव में क्या होता है।

\n\n

इस लेख में, हम केवल यह नहीं दिखाएंगे कि आधुनिक Swift में dispatch_after कैसे लिखें। हम GCD के अंदर जाएंगे, कतारों, थ्रेड्स और टाइमरों को समझेंगे, ताकि आप विश्वसनीय और कुशल एसिंक्रोनस कोड लिख सकें। चलिए शुरू करते हैं!

\n\n

dispatch_after क्या है और यह asyncAfter क्यों बन गया?

\n\n

Swift के पुराने संस्करणों (1.x, 2.x) में आपको यह कोड मिल सकता था:

\n\n
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * NSEC_PER_SEC)), dispatch_get_main_queue()) {\n    print("2 सेकंड बीत गए")\n}
\n\n

यह कोड काम करता था, लेकिन बोझिल लगता था। Swift 3 से शुरू करके, Apple ने पूरे GCD API का रीफैक्टरिंग किया, इसे और अधिक "स्विफ्टी" बना दिया। अब वही कार्यक्षमता इस तरह दिखती है:

\n\n
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {\n    print("2 सेकंड बीत गए")\n}
\n\n

ध्यान दें: asyncAfter कतार (DispatchQueue) की एक विधि है, न कि एक अलग फ़ंक्शन। यह एक महत्वपूर्ण बदलाव है: अब आप स्पष्ट रूप से बताते हैं कि कार्य को किस कतार पर निष्पादित करना है।

\n\n

GCD अंदर से कैसे काम करता है: कतारें, थ्रेड और टाइमर

\n\n

dispatch_after (या asyncAfter) को समझने के लिए, तीन संस्थाओं को समझना होगा:

\n\n
    \n
  • DispatchQueue — कार्यों की कतार। यह अनुक्रमिक (serial) या समवर्ती (concurrent) हो सकती है।
  • \n
  • DispatchWorkItem — वह कार्य जिसे आप कतार में लगाते हैं। हमारे मामले में यह एक क्लोजर है।
  • \n
  • DispatchTime — वह समय बिंदु जब कार्य शुरू होना चाहिए। GCD डेडलाइन को ट्रैक करने के लिए सिस्टम टाइमर का उपयोग करता है।
  • \n
\n\n

जब आप asyncAfter कॉल करते हैं, GCD एक नया थ्रेड नहीं बनाता है। इसके बजाय, यह:

\n\n
    \n
  1. एक टाइमर बनाता है जो निर्दिष्ट समय पर सक्रिय होगा।
  2. \n
  3. कार्य को विलंबित कार्यों की एक विशेष कतार में रखता है (जिसे अक्सर dispatch timer कहा जाता है)।
  4. \n
  5. जब टाइमर सक्रिय होता है, GCD कार्य को सामान्य DispatchQueue में स्थानांतरित करता है, जहाँ वह अपने थ्रेड की प्रतीक्षा करता है।
  6. \n
\n\n

यदि जिस कतार में आप कार्य डाल रहे हैं वह अन्य कार्यों में व्यस्त है, तो आपका विलंबित कार्य निर्दिष्ट डेडलाइन के बाद निष्पादित हो सकता है। यह एक महत्वपूर्ण बिंदु है: dispatch_after गारंटी देता है कि कार्य डेडलाइन से पहले निष्पादित नहीं होगा, लेकिन बाद में निष्पादित हो सकता है।

\n\n

व्यावहारिक उदाहरण: UI अपडेट के लिए dispatch_after

\n\n

सबसे आम परिदृश्य — उपयोगकर्ता की कार्रवाई के कुछ समय बाद इंटरफ़ेस को अपडेट करना। मान लीजिए, आप "सहेजा गया" संदेश दिखाते हैं, और 2 सेकंड बाद इसे हटा देते हैं:

\n\n
func showTemporaryMessage() {\n    let messageLabel = UILabel()\n    messageLabel.text = "सहेजा गया!"\n    messageLabel.alpha = 1.0\n    view.addSubview(messageLabel)\n\n    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {\n        UIView.animate(withDuration: 0.5) {\n            messageLabel.alpha = 0.0\n        } completion: { _ in\n            messageLabel.removeFromSuperview()\n        }\n    }\n}
\n\n

ध्यान दें: हम DispatchQueue.main का उपयोग कर रहे हैं, क्योंकि UI से संबंधित सभी ऑपरेशन मुख्य थ्रेड पर ही निष्पादित होने चाहिए। यदि हमने पृष्ठभूमि कतार पर asyncAfter कॉल किया होता और फिर UI बदलने की कोशिश की होती, तो ऐप क्रैश हो जाता।

\n\n

dispatch_after की छिपी समस्याएं: मेमोरी लीक और self को कैप्चर करना

\n\n

सबसे आम गलतियों में से एक है क्लोजर के अंदर self का स्ट्रॉन्ग रेफरेंस लेना

ब्लॉग

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