قوائم المهام في Swift: من GCD إلى Swift Concurrency
في تطوير iOS وmacOS، تعد إدارة التنفيذ المتوازي للكود إحدى المهام الأساسية. تسمح قوائم المهام (queues) بتوزيع الحمل بكفاءة بين الخيوط دون حظر واجهة المستخدم. في هذا الدليل، سنستعرض ثلاث طرق رئيسية: Grand Central Dispatch (GCD) الكلاسيكي، والتجريد OperationQueue، والآلية الحديثة Swift Concurrency (async/await).
1. Grand Central Dispatch (GCD) — أساس التوازي
GCD هي مكتبة C منخفضة المستوى مدمجة في Swift. تدير مجموعة من الخيوط وتوفر نوعين من قوائم المهام:
- تسلسلية (Serial) — يتم تنفيذ المهام واحدة تلو الأخرى بترتيب الإضافة.
- متزامنة (Concurrent) — يتم تشغيل المهام في وقت واحد، ولا يُضمن ترتيب الإنجاز.
مثال على إنشاء واستخدام قائمة مهام:
import Foundation
// إنشاء قائمة مهام تسلسليةlet serialQueue = DispatchQueue(label: "com.example.serial")
serialQueue.async { print("المهمة 1 بدأت") sleep(1) print("المهمة 1 اكتملت")}
serialQueue.async { print("المهمة 2 بدأت") sleep(1) print("المهمة 2 اكتملت")}
// قائمة مهام متزامنةlet concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
concurrentQueue.async { print("المهمة المتزامنة A")}
concurrentQueue.async { print("المهمة المتزامنة B")}الإمكانيات الرئيسية لـ GCD:
DispatchQueue.main— القائمة الرئيسية (خيط واجهة المستخدم).DispatchQueue.global(qos: .userInitiated)— قوائم عالمية ذات أولوية (QoS).dispatchGroup— مزامنة عدة مهام.dispatchSemaphore— التحكم في الوصول إلى الموارد.
2. OperationQueue — تجريد موجه للكائنات
OperationQueue مبنية فوق GCD، ولكنها توفر واجهة برمجة تطبيقات (API) ذات مستوى أعلى. المزايا الرئيسية:
- إدارة التبعيات بين العمليات.
- إلغاء المهام (cancel).
- مراقبة الحالة (isFinished, isExecuting).
- الحد الأقصى لعدد العمليات المتزامنة.
مثال باستخدام BlockOperation:
import Foundation
let operationQueue = OperationQueue()operationQueue.maxConcurrentOperationCount = 2
let operation1 = BlockOperation { print("العملية 1: تحميل البيانات") sleep(2) print("العملية 1 اكتملت")}
let operation2 = BlockOperation { print("العملية 2: معالجة") sleep(1) print("العملية 2 اكتملت")}
// تعيين تبعية: العملية 2 ستبدأ فقط بعد اكتمال العملية 1operation2.addDependency(operation1)
operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)
// إلغاء العمليةoperation1.cancel()متى تستخدم OperationQueue:
- سلاسل مهام معقدة ذات تبعيات.
- الحاجة إلى تحكم دقيق (إيقاف مؤقت، إلغاء).
- العمل مع KVO (Key-Value Observing) للمراقبة.
3. Swift Concurrency — النهج الحديث (iOS 13+, macOS 10.15+)
بدءًا من Swift 5.5، قدمت Apple دعمًا مدمجًا للبرمجة غير المتزامنة من خلال async/await وTask وTaskGroup. هذه طريقة أكثر أمانًا وقابلية للقراءة للعمل مع التوازي.
مثال أساسي:
import Foundation
func fetchUserData() async -> String { // محاكاة طلب شبكة try? await Task.sleep(nanoseconds: 2 * 1_000_000_000) return "تم تحميل بيانات المستخدم"}
func processData()