Planificador de tareas Swift para iOS/macOS: EventKit y DispatchSource

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations