مجدول المهام بلغة Swift لنظامي iOS و macOS: دليل كامل
في التطوير الحديث لنظامي iOS و macOS، يُعد مجدول المهام (task scheduler) مكونًا أساسيًا لإنشاء تطبيقات فعالة وسريعة الاستجابة. توفر Swift عدة أدوات قوية لتنفيذ الجدولة: من المؤقتات البسيطة إلى التكامل مع التقويم النظامي عبر EventKit والآليات منخفضة المستوى DispatchSource. في هذه المقالة، سنشرح بالتفصيل كيفية إنشاء مجدول مهام موثوق بلغة Swift لكلا النظامين.
المكونات الأساسية لمجدول المهام Swift
قبل كتابة الكود، من المهم فهم الأدوات المتاحة لمطور Swift:
- Timer — فئة أساسية لتنفيذ الكود على فترات زمنية محددة أو مع تأخير.
- DispatchSourceTimer — مؤقت أكثر كفاءة يعتمد على Grand Central Dispatch (GCD).
- EventKit — إطار عمل للتعامل مع التقويم والتذكيرات على iOS/macOS.
- UNUserNotificationCenter — نظام الإشعارات المحلية لإعلام المستخدم بتأخير.
- Background Tasks — لتنفيذ المهام الخلفية على iOS 13+.
مؤقت أساسي باستخدام Timer
أبسط طريقة لإنشاء مجدول مهام هي استخدام Timer. لكن تذكر أنه يعمل في الخيط الرئيسي ما لم يُحدد خلاف ذلك.
import Foundation
class SimpleTaskScheduler { var timer: Timer? func scheduleTask(interval: TimeInterval, repeats: Bool, task: @escaping () -> Void) { timer = Timer.scheduledTimer(withTimeInterval: interval, repeats: repeats) { _ in task() } } func cancel() { timer?.invalidate() timer = nil }}
// مثال على الاستخدامlet scheduler = SimpleTaskScheduler()scheduler.scheduleTask(interval: 5.0, repeats: true) { print("تم تنفيذ المهمة بعد 5 ثوانٍ")}مجدول متقدم باستخدام DispatchSourceTimer
للحصول على جدولة أكثر دقة وكفاءة، استخدم DispatchSourceTimer. يعمل في قوائم الانتظار الخلفية ولا يحجب واجهة المستخدم.
import Foundation
class AdvancedTaskScheduler { private var timer: DispatchSourceTimer? private let queue = DispatchQueue(label: "com.pythonlib.scheduler", qos: .background) func scheduleTask(deadline: DispatchTime, interval: DispatchTimeInterval? = nil, leeway: DispatchTimeInterval = .seconds(1), task: @escaping () -> Void) { timer?.cancel() timer = DispatchSource.makeTimerSource(queue: queue) if let interval = interval { timer?.schedule(deadline: deadline, repeating: interval, leeway: leeway) } else { timer?.schedule(deadline: deadline, leeway: leeway) } timer?.setEventHandler { [weak self] in guard self?.timer != nil else { return } task() } timer?.activate() } func cancel() { timer?.cancel() timer = nil }}
// الاستخدامlet advancedScheduler = AdvancedTaskScheduler()advancedScheduler.scheduleTask(deadline: .now() + 2.0, interval: .seconds(10)) { print("المهمة الخلفية تُنفذ كل 10 ثوانٍ")}التكامل مع EventKit لمهام التقويم
يتيح EventKit إنشاء مهام تتم مزامنتها مع التقويم النظامي. هذا مثالي لتطبيقات المجدول.
import EventKit
class CalendarTaskScheduler { let eventStore = EKEventStore() func requestAccess(completion: @escaping (Bool) -> Void) { eventStore.requestAccess(to: .event) { granted, error in completion(granted) } } func creat