Planificateur de tâches en Swift pour iOS et macOS : guide complet
Dans le développement moderne pour iOS et macOS, le planificateur de tâches (task scheduler) est un composant clé pour créer des applications efficaces et réactives. Swift fournit plusieurs outils puissants pour implémenter la planification : des minuteurs simples à l'intégration avec le calendrier système via EventKit et les mécanismes de bas niveau DispatchSource. Dans cet article, nous allons détailler comment créer un planificateur de tâches fiable en Swift pour les deux plateformes.
Composants principaux du planificateur de tâches Swift
Avant d'écrire du code, il est important de comprendre quels outils sont disponibles pour le développeur Swift :
- Timer — classe de base pour exécuter du code à des intervalles définis ou avec un délai.
- DispatchSourceTimer — minuteur plus performant basé sur Grand Central Dispatch (GCD).
- EventKit — framework pour travailler avec le calendrier et les rappels sur iOS/macOS.
- UNUserNotificationCenter — système de notifications locales pour alerter l'utilisateur de manière différée.
- Background Tasks — pour exécuter des tâches en arrière-plan sur iOS 13+.
Minuteur de base avec Timer
La façon la plus simple de créer un planificateur de tâches est d'utiliser Timer. Cependant, rappelez-vous qu'il fonctionne sur le thread principal, sauf indication contraire.
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 }}
// Exemple d'utilisationlet scheduler = SimpleTaskScheduler()scheduler.scheduleTask(interval: 5.0, repeats: true) { print("Tâche exécutée après 5 secondes")}Planificateur avancé avec DispatchSourceTimer
Pour une planification plus précise et performante, utilisez DispatchSourceTimer. Il fonctionne dans les files d'attente en arrière-plan et ne bloque pas l'interface utilisateur.
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 }}
// Utilisationlet advancedScheduler = AdvancedTaskScheduler()advancedScheduler.scheduleTask(deadline: .now() + 2.0, interval: .seconds(10)) { print("Tâche en arrière-plan exécutée toutes les 10 secondes")}Intégration avec EventKit pour les tâches calendaires
EventKit permet de créer des tâches qui se synchronisent avec le calendrier système. C'est idéal pour les applications de planification.
import EventKit
class CalendarTaskScheduler { let eventStore = EKEventStore() func requestAccess(completion: @escaping (Bool) -> Void) { eventStore.requestAccess(to: .event) { granted, error in completion(granted) } } func creat Aussi dans la bibliothèque
Client Redis pour C++ : connexion, installation et exemples
Apprentissage automatique en Rust : aperçu des bibliothèques pour le ML et la Data Science
Envoi d'email en TypeScript : guide complet avec nodemailer et SMTP