مجدول مهام Swift (iOS/macOS): دليل شامل
مجدول المهام (Task Scheduler) هو مكون أساسي في تطوير تطبيقات iOS وmacOS، حيث يتيح إدارة فعالة للعمليات غير المتزامنة والمهام الخلفية وتعدد الخيوط. في Swift، تتوفر عدة أدوات قوية: Grand Central Dispatch (GCD)، OperationQueue، الآلية الجديدة async/await (Swift Concurrency)، وإطار العمل Combine. في هذه المقالة، سنشرح كل أداة بالتفصيل، مع أمثلة برمجية وتوصيات لاختيار الأداة المناسبة.
1. Grand Central Dispatch (GCD)
GCD هي مكتبة منخفضة المستوى لإدارة المهام المتوازية. تعمل مع الطوابير (DispatchQueue) وتوفر توزيعًا فعالًا للخيوط.
الأنواع الرئيسية للطوابير:
- main — الطابور الرئيسي (خيط واجهة المستخدم).
- global — طوابير خلفية بأولويات مختلفة (QoS).
- private — طوابير مخصصة (تسلسلية أو متزامنة).
مثال على استخدام GCD:
import Foundation
// مهمة غير متزامنة في الخلفيةDispatchQueue.global(qos: .background).async { let result = performHeavyComputation() // العودة إلى الخيط الرئيسي لتحديث واجهة المستخدم DispatchQueue.main.async { updateUI(with: result) }}
// طابور تسلسلي للتنفيذ المتتابعlet serialQueue = DispatchQueue(label: "com.example.serial")serialQueue.async { // المهمة 1}serialQueue.async { // المهمة 2 (ستُنفذ بعد المهمة 1)}
// طابور متزامنlet concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)concurrentQueue.sync { // عملية حظر (بحذر!)}2. OperationQueue
OperationQueue هي تجريد أعلى مستوى فوق GCD. تعمل مع كائنات Operation التي يمكن تخصيصها وإلغاؤها وربطها بالتبعيات.
مزايا OperationQueue:
- إدارة مرنة للتبعيات بين المهام.
- دعم مدمج للإلغاء والأولويات.
- مراقبة حالة العمليات عبر KVO.
مثال مع BlockOperation:
import Foundation
let operationQueue = OperationQueue()operationQueue.maxConcurrentOperationCount = 2
let operation1 = BlockOperation { print("المهمة 1")}let operation2 = BlockOperation { print("المهمة 2")}let operation3 = BlockOperation { print("المهمة 3")}
// تعيين تبعية: المهمة 3 ستُنفذ بعد المهمتين 1 و 2operation3.addDependency(operation1)operation3.addDependency(operation2)
operationQueue.addOperations([operation1, operation2, operation3], waitUntilFinished: false)
// إلغاء جميع العملياتoperationQueue.cancelAllOperations()إنشاء فئة فرعية مخصصة من Operation:
class DownloadOperation: Operation { private let url: URL init(url: URL) { self.url = url } override func main() { guard !isCancelled else { return } // تنفيذ التحميل let data = try? Data(contentsOf: url) // معالجة النتيجة }}
let downloadOp = DownloadOperation(url: URL(string: "https://example.com/data")!)operationQueue.addOperation(downloadOp)3. Swift Concurrency (async/await)
بدءًا من Swift 5.5، تم إضافة دعم مدمج للبرمجة غير المتزامنة عبر الكلمات المفتاحية async وawait وTask. هذه طريقة حديثة وآمنة للعمل مع التزامن.
المكونات الرئيسية:
- async — وضع علامة على دالة غير متزامنة.
- await — انتظار اكتمال عملية غير متزامنة.
- Task — إنشاء مهمة غير متزامنة جديدة.
- TaskGroup — تنفيذ جماعي للمهام. \