العمل مع قوائم المهام في Swift: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في قوائم المهام في Swift



يجب أن تكون التطبيقات الحديثة للهواتف المحمولة وأجهزة الكمبيوتر المكتبية سريعة وسريعة الاستجابة. إذا قمت بتنفيذ عمليات حسابية ثقيلة أو تحميل بيانات من الشبكة مباشرة في الخيط الرئيسي، فسيتجمد تطبيقك وسيغلقه المستخدم ببساطة. الحل هو قوائم المهام (queues).



في Swift (iOS/macOS)، تعتمد إدارة التزامن على ثلاث تقنيات رئيسية: Grand Central Dispatch (GCD)، Operation Queue، وبناء الجملة الحديث async/await. في هذه المقالة، سنشرح كل منها من الصفر، ونعرض أمثلة على الكود، ونوضح متى نستخدم كل منها.



1. Grand Central Dispatch (GCD) و DispatchQueue



GCD هي مكتبة منخفضة المستوى من Apple لإدارة التنفيذ المتوازي للكود. العنصر الأساسي هو DispatchQueue. تقوم قائمة الانتظار بتنفيذ المهام (الإغلاقات) بترتيب إضافتها.



أنواع قوائم الانتظار



  • Main Queue — قائمة انتظار تسلسلية للخيط الرئيسي. تُستخدم لتحديث واجهة المستخدم.
  • Global Queues — قوائم انتظار متوازية بأولويات مختلفة (QoS: .userInteractive، .userInitiated، .utility، .background).
  • Custom Queues — قوائم الانتظار الخاصة بك (تسلسلية أو متوازية).


مثال: تنفيذ مهمة في الخلفية



import Foundation

// بشكل غير متزامن في قائمة انتظار الخلفيةDispatchQueue.global(qos: .background).async { // عمل ثقيل (تحميل، معالجة بيانات) let result = performHeavyTask() // إعادة النتيجة إلى الخيط الرئيسي DispatchQueue.main.async { updateUI(with: result) }}

func performHeavyTask() -> String { Thread.sleep(forTimeInterval: 2) // محاكاة العمل return "تم!"}

func updateUI(with text: String) { print("تم تحديث واجهة المستخدم: \\(text)")}


لاحظ: .async لا يحجب الخيط المستدعي. إذا كنت بحاجة إلى انتظار النتيجة، استخدم .sync (لكن لا تستدعي .sync من الخيط الرئيسي أبدًا — ستحصل على deadlock).



مثال: قائمة انتظار تسلسلية



let serialQueue = DispatchQueue(label: "com.example.serial")

serialQueue.async { print("المهمة 1")}serialQueue.async { print("المهمة 2")}// الإخراج: المهمة 1، ثم المهمة 2


2. Operation Queue — نهج أكثر مرونة



OperationQueue هي طبقة فوق GCD توفر واجهة موجهة للكائنات. تقوم بإنشاء Operation (أو BlockOperation)، وتكوين التبعيات، وإضافتها إلى قائمة الانتظار.



المزايا مقارنة بـ GCD



  • إلغاء المهام (cancel())
  • التبعيات بين المهام
  • مراقبة الحالة (isReady، isExecuting، isFinished)
  • الحد الأقصى لعدد العمليات المتوازية


مثال: الاستخدام الأساسي



let operationQueue = OperationQueue()operationQueue.maxConcurrentOperationCount = 2 // لا يزيد عن مهمتين في وقت واحد

let operation1 = BlockOperation { print("جارٍ تحميل البيانات...") Thread.sleep(forTimeInterval: 1)}

let operation2 = BlockOperation { print("جارٍ معالجة البيانات...") Thread.sleep(forTimeInterval: 1)}

// ستبدأ operation2 فقط بعد اكتمال operation1operation2.addDependency(operation1)

operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)


مثال: إلغاء عملية



let cancelableOp = BlockOperation {    if !cancelableOp.isCancelled {        print("أقوم بعمل مهم")    }}

operationQueue.addOperation(cancelableOp)

// بعد فترة نلغيDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { cancelableOp.cancel() print("تم إلغاء العملية")}
\

المدونات

توصيات الكتب