مجدول مهام Swift (iOS/macOS): GCD وOperationQueue وTimer
في التطوير لنظامي iOS وmacOS، إدارة المهام غير المتزامنة والتنفيذ المؤجل وتعدد المهام هي أساس أداء واستجابة التطبيقات. في Swift، تُستخدم ثلاثة مكونات رئيسية لهذا الغرض: GCD (Grand Central Dispatch)، OperationQueue، وTimer. في هذه المقالة، سنشرح كل منها بالتفصيل، ونعرض أمثلة كود، ونوضح متى يتم استخدام كل منها.
1. Grand Central Dispatch (GCD) — DispatchQueue
GCD هو واجهة برمجة تطبيقات منخفضة المستوى بلغة C، توفرها Swift عبر DispatchQueue. يسمح بتنفيذ المهام بشكل غير متزامن، متوازٍ أو متسلسل، مع إدارة الخيوط تلقائياً.
الأنواع الرئيسية لقوائم الانتظار:
- Main Queue — قائمة انتظار متسلسلة، تنفذ المهام على الخيط الرئيسي (واجهة المستخدم).
- Global Queues — قوائم انتظار متوازية بأولويات مختلفة (خلفية، بدأها المستخدم، خدمية).
- Custom Serial/Concurrent Queues — يتم إنشاؤها بواسطة المطور.
مثال: تحميل بيانات غير متزامن
import Foundation
// الحصول على قائمة انتظار خلفية عامةDispatchQueue.global(qos: .background).async { // عمل ثقيل (تحليل، تحميل) let data = try? Data(contentsOf: URL(string: "https://example.com/data.json")!) // العودة إلى الخيط الرئيسي لتحديث واجهة المستخدم DispatchQueue.main.async { // تحديث الواجهة print("تم تحميل البيانات: \\(data?.count ?? 0) بايت") }}التنفيذ المؤجل (dispatch_after)
let deadline = DispatchTime.now() + 3.0 // بعد 3 ثوانٍDispatchQueue.main.asyncAfter(deadline: deadline) { print("مرت 3 ثوانٍ")}مجموعات المهام (DispatchGroup)
let group = DispatchGroup()
group.enter()DispatchQueue.global().async { // المهمة 1 Thread.sleep(forTimeInterval: 2) group.leave()}
group.enter()DispatchQueue.global().async { // المهمة 2 Thread.sleep(forTimeInterval: 1) group.leave()}
// إشعار بانتهاء جميع المهامgroup.notify(queue: .main) { print("جميع المهام اكتملت")}2. OperationQueue — مجدول عالي المستوى
OperationQueue مبني فوق GCD، لكنه يوفر مرونة أكبر: يمكن تعيين تبعيات بين العمليات، أولويات، إلغاء مهام فردية، وتحديد الحد الأقصى لعدد العمليات المتوازية.
إنشاء وتنفيذ العمليات
let queue = OperationQueue()queue.maxConcurrentOperationCount = 2 // بحد أقصى مهمتين متوازيتين
let operation1 = BlockOperation { print("العملية 1") Thread.sleep(forTimeInterval: 1)}
let operation2 = BlockOperation { print("العملية 2") Thread.sleep(forTimeInterval: 1)}
// تعيين تبعية: العملية 2 ستبدأ فقط بعد العملية 1operation2.addDependency(operation1)
queue.addOperations([operation1, operation2], waitUntilFinished: false)إلغاء العمليات
operation1.cancel() // يلغي العملية إذا لم تكن قيد التنفيذ بعد
// التحقق من الإلغاء داخل العمليةlet cancellableOp = BlockOperation { if !cancellableOp.isCancelled { print("جارٍ التنفيذ") }}الميزات الرئيسية لـ OperationQueue:
- يمكن تعيين
qualityOfService(الأولوية). - يمكن أن تكون العمليات كائنات
Operationمع تجاوز طريقةmain(). - يدعم KVO (Key-Value Observing) لتتبع الحالة.
3. Timer — للمهام الدورية والمؤجلة
Timer (المعروف سابقاً باسم NSTimer) يُستخدم لتنفيذ الكود على فترات زمنية محددة. مهم: المؤقتات تعمل على