Planificador de tareas en Swift para iOS y macOS: guía completa
En el desarrollo moderno para iOS y macOS, el planificador de tareas (task scheduler) es un componente clave para crear aplicaciones eficientes y receptivas. Swift proporciona varias herramientas potentes para implementar la planificación: desde temporizadores simples hasta la integración con el calendario del sistema a través de EventKit y los mecanismos de bajo nivel DispatchSource. En este artículo, analizaremos en detalle cómo crear un planificador de tareas confiable en Swift para ambas plataformas.
Componentes principales del planificador de tareas Swift
Antes de escribir código, es importante comprender qué herramientas están disponibles para el desarrollador de Swift:
- Timer — clase básica para ejecutar código en intervalos determinados o con retraso.
- DispatchSourceTimer — temporizador de mayor rendimiento basado en Grand Central Dispatch (GCD).
- EventKit — framework para trabajar con el calendario y recordatorios en iOS/macOS.
- UNUserNotificationCenter — sistema de notificaciones locales para alertas diferidas al usuario.
- Background Tasks — para ejecutar tareas en segundo plano en iOS 13+.
Temporizador básico usando Timer
La forma más sencilla de crear un planificador de tareas es usar Timer. Sin embargo, recuerda que funciona en el hilo principal, a menos que se indique lo contrario.
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 }}
// Ejemplo de usolet scheduler = SimpleTaskScheduler()scheduler.scheduleTask(interval: 5.0, repeats: true) { print("Tarea ejecutada después de 5 segundos")}Planificador avanzado con DispatchSourceTimer
Para una planificación más precisa y eficiente, usa DispatchSourceTimer. Funciona en colas en segundo plano y no bloquea la UI.
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 }}
// Usolet advancedScheduler = AdvancedTaskScheduler()advancedScheduler.scheduleTask(deadline: .now() + 2.0, interval: .seconds(10)) { print("La tarea en segundo plano se ejecuta cada 10 segundos")}Integración con EventKit para tareas de calendario
EventKit permite crear tareas que se sincronizan con el calendario del sistema. Esto es ideal para aplicaciones planificadoras.
import EventKit
class CalendarTaskScheduler { let eventStore = EKEventStore() func requestAccess(completion: @escaping (Bool) -> Void) { eventStore.requestAccess(to: .event) { granted, error in completion(granted) } } func creat También en la biblioteca
Dapper para C# (.NET): guía completa con ejemplos
Colas de tareas en Kotlin: Coroutines, Flow y bibliotecas para procesamiento en segundo plano
Trabajo con CSV en PHP: lectura, escritura y procesamiento de datos