Agendador de Tarefas em Swift para iOS e macOS: guia completo
No desenvolvimento moderno para iOS e macOS, o agendador de tarefas (task scheduler) é um componente chave para criar aplicações eficientes e responsivas. O Swift oferece várias ferramentas poderosas para implementar agendamento: desde timers simples até integração com o calendário do sistema através de EventKit e mecanismos de baixo nível como DispatchSource. Neste artigo, vamos detalhar como criar um agendador de tarefas robusto em Swift para ambas as plataformas.
Componentes principais do agendador de tarefas Swift
Antes de escrever código, é importante entender quais ferramentas estão disponíveis para o desenvolvedor Swift:
- Timer — classe básica para executar código em intervalos definidos ou com atraso.
- DispatchSourceTimer — timer mais performático baseado no Grand Central Dispatch (GCD).
- EventKit — framework para trabalhar com calendário e lembretes no iOS/macOS.
- UNUserNotificationCenter — sistema de notificações locais para alertar o usuário de forma adiada.
- Background Tasks — para executar tarefas em segundo plano no iOS 13+.
Timer básico usando Timer
A maneira mais simples de criar um agendador de tarefas é usar Timer. No entanto, lembre-se de que ele opera na thread principal, a menos que especificado o contrário.
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 }}
// Exemplo de usolet scheduler = SimpleTaskScheduler()scheduler.scheduleTask(interval: 5.0, repeats: true) { print("Tarefa executada após 5 segundos")}Agendador avançado com DispatchSourceTimer
Para um agendamento mais preciso e performático, use DispatchSourceTimer. Ele opera em filas de segundo plano e não bloqueia a 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("Tarefa em segundo plano executada a cada 10 segundos")}Integração com EventKit para tarefas de calendário
EventKit permite criar tarefas que sincronizam com o calendário do sistema. Isso é ideal para aplicações de agendamento.
import EventKit
class CalendarTaskScheduler { let eventStore = EKEventStore() func requestAccess(completion: @escaping (Bool) -> Void) { eventStore.requestAccess(to: .event) { granted, error in completion(granted) } } func creat