"एक सेकंड रुको": Swift में देरी क्यों जादू है, हैक नहीं
\n\nकल्पना करें: आप पिज़्ज़ा ऑर्डर करने का ऐप बना रहे हैं। यूज़र "भुगतान करें" पर क्लिक करता है, और तुरंत — बम! — पैसे कट जाते हैं। बिना एनिमेशन, बिना ठहराव, बिना "कुछ हो रहा है" के एहसास के। यूज़र डर जाता है, ऐप बंद कर देता है, और आप एक ग्राहक खो देते हैं। Swift में देरी कोई कमज़ोर तरीका नहीं, बल्कि UX डिज़ाइन और सही आर्किटेक्चर का एक उपकरण है।
\n\nStack Overflow पर "How to create a delay in Swift?" सवाल ने हज़ारों व्यूज़ जुटाए हैं। और इसमें कोई आश्चर्य नहीं: शुरुआती लोग sleep() का उपयोग करने की कोशिश करते हैं (स्पॉयलर: ऐसा नहीं करना चाहिए), जबकि प्रोफेशनल्स सुरुचिपूर्ण समाधान ढूंढते हैं। हम 5 काम करने वाले तरीकों पर चर्चा करेंगे — क्लासिक GCD से लेकर आधुनिक async/await तक। चलिए शुरू करते हैं!
1. क्लासिक: DispatchQueue.main.asyncAfter (iOS 4+)
\nSwift में देरी बनाने का सबसे लोकप्रिय तरीका DispatchQueue.main.asyncAfter है। यह iOS के किसी भी वर्जन पर काम करता है और किसी अतिरिक्त इम्पोर्ट की आवश्यकता नहीं है। यह मुख्य थ्रेड पर कोड चलाने के लिए उपयुक्त है (जैसे, UI अपडेट करना)।
import UIKit\n\nclass ViewController: UIViewController {\n override func viewDidLoad() {\n super.viewDidLoad()\n \n // 2 सेकंड की देरी\n DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {\n print("2 सेकंड बीत गए!")\n self.showAlert()\n }\n }\n \n func showAlert() {\n let alert = UIAlertController(title: "नमस्ते!", message: "यह देरी है", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "ठीक है", style: .default))\n present(alert, animated: true)\n }\n}\n\nफायदे और नुकसान
\n- \n
- फायदे: सरलता, पिछली संगतता, मुख्य थ्रेड पर काम करता है। \n
- नुकसान: देरी को रद्द नहीं किया जा सकता (जब तक DispatchWorkItem सेव न किया जाए)। \n
2. DispatchWorkItem के माध्यम से रद्द करने योग्य देरी
\nकभी-कभी देरी को रद्द करने की आवश्यकता होती है — उदाहरण के लिए, यूज़र स्क्रीन से चला गया। DispatchWorkItem इस समस्या को हल करता है। "कार्य" का रेफरेंस सेव करें और cancel() कॉल करें।
class DelayedTask {\n private var workItem: DispatchWorkItem?\n \n func scheduleDelayedAction() {\n // कार्य बनाएँ\n let item = DispatchWorkItem { [weak self] in\n print("देरी के बाद कार्य पूरा हुआ")\n self?.doSomething()\n }\n \n // सेव करें और चलाएँ\n workItem = item\n DispatchQueue.main.asyncAfter(deadline: .now() + 3.0, execute: item)\n }\n \n func cancelDelayedAction() {\n workItem?.cancel()\n workItem = nil\n print("कार्य रद्द कर दिया गया")\n }\n \n func doSomething() {\n // आपका कोड\n }\n}\n\n// उपयोग\nlet task = DelayedTask()\ntask.scheduleDelayedAction()\n// 1 सेकंड बाद रद्द करें\nDispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {\n task.cancelDelayedAction()\n}\n\n[weak self] पर ध्यान दें — Swift में मेमोरी लीक से बचने के लिए यह आवश्यक है। देरी कंट्रोलर से अधिक समय तक जीवित रह सकती है यदि रेफरेंस कमज़ोर न किया जाए।
3. Timer.scheduledTimer: दोहराव के साथ देरी
\nSwift टाइमर केवल दोहराए जाने वाले कार्यों के लिए नहीं हैं। आप देरी के साथ एक बार चलने वाला टाइमर बना सकते हैं। लाभ: टाइमर को आसानी से रद्द किया जा सकता है और रोका जा सकता है।
\n\nclass TimerExample {\n var timer: Timer?\n \n func startDelayedAction() {\n // 1.5 सेकंड के बाद एक बार चलने वाला टाइमर\n timer = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false) { [weak self] _ in\n print("टाइमर 1.5 सेकंड बाद चला")\n self?.updateUI()\n }\n }\n \n func stopTimer() {\n timer?.invalidate()\n timer = nil\n }\n \n func updateUI() {\n // इंटरफ़ेस अपडेट करें\n }\n}\n\nTimer का उपयोग कब करें
\n- \n