Avatar ·

كيفية استخدام dispatch_after في Swift 3 و 4 و 5 للتنفيذ المؤجل؟

مرحبًا! أنا مبتدئ في Swift وأحاول نقل كود قديم من Objective-C حيث كنت أستخدم dispatch_after لتأخير التنفيذ. كنت أكتب شيئًا مثل: ```objective-c dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"مرت ثانيتان"); }); ``` لكن في Swift 3 وما فوق لا يعمل هذا. جربت الكتابة هكذا: ```swift dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2.0 * Double(NSEC_PER_SEC))), DispatchQueue.main, { print("مرت ثانيتان") }) ``` لكن Xcode يعطي خطأ: "Use of unresolved identifier 'dispatch_after'". أفهم أن GCD تغير كثيرًا، لكن لا أجد مثالًا واضحًا لـ Swift 3/4/5. من فضلك اشرح كيفية عمل تأخير لمدة ثانيتين مع التنفيذ على الـ main thread. أحتاج مثالًا بسيطًا عمليًا لأتمكن من إدراجه في كودي. شكرًا مقدمًا! <<>>

الطريقة الصحيحة للتنفيذ المؤجل في Swift 3+

في Swift 3، تم تغيير واجهة برمجة تطبيقات GCD (Grand Central Dispatch) بشكل كبير. لم يعد dispatch_after موجودًا كدالة منفصلة. بدلاً من ذلك، تستخدم الآن أسلوب asyncAfter على كائن DispatchQueue. إليك المثال الصحيح لتأخير التنفيذ لمدة ثانيتين على الـ main thread: ```swift DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { print("مرت ثانيتان") } ``` هذا الكود يعمل في Swift 3 و 4 و 5. يمكنك أيضًا استخدامه مع queues أخرى عن طريق تغيير DispatchQueue.main إلى أي queue تريدها، مثل DispatchQueue.global(). إذا كنت بحاجة إلى تأخير أكثر دقة باستخدام nanoseconds، يمكنك استخدام: ```swift let delay = DispatchTime.now() + Double(Int64(2.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) DispatchQueue.main.asyncAfter(deadline: delay) { print("مرت ثانيتان") } ``` لكن الطريقة الأولى (.now() + 2.0) هي الأبسط والأكثر شيوعًا. أتمنى أن يساعدك هذا في نقل كودك!