«انتظر ثانية»: لماذا التأخيرات في Swift هي سحر وليست حيلًا
\n\nتخيل: أنت تكتب تطبيقًا لطلب البيتزا. المستخدم يضغط على «الدفع»، وفجأة - بام! - خصم المال. بدون رسوم متحركة، بدون توقف، بدون شعور بأن «شيئًا ما يحدث». المستخدم يخاف، يغلق التطبيق، وأنت تخسر العميل. التأخير في Swift ليس حلاً مؤقتًا، بل هو أداة لتصميم تجربة المستخدم والهندسة المعمارية الصحيحة.
\n\nسؤال «How to create a delay in Swift?» على Stack Overflow حصد عشرات الآلاف من المشاهدات. وليس من المستغرب: المبتدئون يحاولون استخدام sleep() (تحذير: لا يمكن فعل ذلك)، بينما المحترفون يبحثون عن حلول أنيقة. سنستعرض 5 طرق عملية - من GCD الكلاسيكي إلى async/await الحديث. هيا بنا!
1. الطريقة الكلاسيكية: DispatchQueue.main.asyncAfter (iOS 4+)
\nالطريقة الأكثر شيوعًا لإنشاء تأخير في Swift هي DispatchQueue.main.asyncAfter. تعمل على أي إصدار من iOS ولا تتطلب استيرادات إضافية. مناسبة لتنفيذ الكود على الخيط الرئيسي (مثل تحديث واجهة المستخدم).
import UIKit\n\nclass ViewController: UIViewController {\n override func viewDidLoad() {\n super.viewDidLoad()\n \n // تأخير لمدة ثانيتين\n DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {\n print("مرت ثانيتان!")\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// بعد ثانية واحدة نقوم بالإلغاء\nDispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {\n task.cancelDelayedAction()\n}\n\nلاحظ استخدام [weak self] - هذا إلزامي لتجنب تسرب الذاكرة في Swift. قد يستمر التأخير بعد اختفاء المتحكم إذا لم يتم تخفيف المرجع.
3. Timer.scheduledTimer: تأخير مع التكرار
\nالمؤقتات في Swift ليست فقط للمهام المتكررة. يمكنك إنشاء مؤقت لمرة واحدة مع تأخير. الميزة: يمكن إلغاء المؤقت بسهولة ويمكن إيقافه مؤقتًا.
\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\nمتى تستخدم Timer
\n- \n