تخطَّ إلى المحتوى

async / await

الدوال غير المتزامنة async / await

async يعلّم دالة بأنها قد تتوقّف أثناء العمل، وawait يستدعيها ويحدّد نقطة التوقّف صراحةً — بلا تجميد للواجهة.

منذ Swift 5.5، async توضع بعد قائمة معاملات الدالة (وقبل throws إن وُجدت) لتعليم أنها قد تُعلّق تنفيذها بانتظار عملية بطيئة. استدعاؤها يتطلّب await، الذي يعلّم نقطة التوقّف المحتملة بوضوح — لا يوجد توقّف مخفي في أي مكان آخر بالكود.

Token بدأ من كود تزامني عبر Task { }. async let يتيح تشغيل عدّة عمليات غير متزامنة بالتوازي بدل التسلسل. actor نوع يشبه class لكن يضمن Swift وصولًا آمنًا لمحتواه من خارجه عبر await فقط، لمنع مشاكل التسابق على البيانات المشتركة.

الصياغة

func fetch() async -> ReturnType { ... }

let result = await fetch()

Task {
    let result = await fetch()
}

📄 مثال

func fetchName() async -> String {
    return "براء"
}

Task {
    let name = await fetchName()
    print("مرحبًا \(name)")
}

أهم النقاط

العنصرالوظيفة
asyncيعلّم دالة بأنها قد تتوقّف أثناء التنفيذ
awaitيستدعي دالة async ويعلّم نقطة توقّف محتملة
Task { }يبدأ سياقًا غير متزامن من كود تزامني عادي
async letيشغّل عدّة عمليات async بالتوازي بدل التسلسل
actorنوع يحمي بياناته المشتركة من مشاكل التسابق (يتطلّب await من خارجه)

💡 نصائح عملية

  • استخدم async let عندما تحتاج عدّة نتائج مستقلّة معًا — أسرع بكثير من await المتتالي
  • @MainActor يضمن تنفيذ دالة أو تحديث خاصية على الخيط الرئيسي — ضروري لتحديثات SwiftUI

⚠️ أخطاء شائعة

  • استدعاء دالة async بدون await — خطأ ترجمة مباشر
  • استخدام await متتاليًا لعمليات مستقلّة عن بعضها بدل async let، فيبطّئ التنفيذ بلا داعٍ

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار SWIFT الكامل بالعربي.