Agendador de Tarefas Swift para iOS/macOS: EventKit e DispatchSource

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations