مجدول المهام Swift لنظامي iOS/macOS: EventKit و DispatchSource

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

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

ابدأ الدورة

مجدول المهام بلغة 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

توصيات