Swift 任务调度器 for iOS/macOS: EventKit 和 DispatchSource

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift 任务调度器 for iOS 和 macOS:完整指南



在现代 iOS 和 macOS 开发中,任务调度器是创建高效且响应迅速的应用程序的关键组件。Swift 提供了几种强大的工具来实现调度:从简单的定时器到通过 EventKit 与系统日历集成,以及底层的 DispatchSource 机制。在本文中,我们将详细讨论如何为这两个平台创建一个可靠的 Swift 任务调度器。



Swift 任务调度器的主要组件



在编写代码之前,了解 Swift 开发者可以使用哪些工具非常重要:



  • Timer — 用于在指定时间间隔或延迟后执行代码的基础类。
  • DispatchSourceTimer — 基于 Grand Central Dispatch (GCD) 的高性能定时器。
  • EventKit — 用于在 iOS/macOS 上处理日历和提醒的框架。
  • UNUserNotificationCenter — 用于延迟通知用户的本地通知系统。
  • Background Tasks — 用于在 iOS 13+ 上执行后台任务。


使用 Timer 的基础定时器



创建任务调度器最简单的方法是使用 Timer。但请注意,除非另有指定,它会在主线程上运行。



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 }}

// 使用示例let scheduler = SimpleTaskScheduler()scheduler.scheduleTask(interval: 5.0, repeats: true) { print("任务在 5 秒后执行")}


使用 DispatchSourceTimer 的高级调度器



为了更精确和高效的调度,请使用 DispatchSourceTimer。它在后台队列中运行,不会阻塞 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 }}

// 使用let advancedScheduler = AdvancedTaskScheduler()advancedScheduler.scheduleTask(deadline: .now() + 2.0, interval: .seconds(10)) { print("后台任务每 10 秒执行一次")}


与 EventKit 集成实现日历任务



EventKit 允许创建与系统日历同步的任务。这对于调度器应用程序来说非常理想。



import EventKit

class CalendarTaskScheduler { let eventStore = EKEventStore() func requestAccess(completion: @escaping (Bool) -> Void) { eventStore.requestAccess(to: .event) { granted, error in completion(granted) } } func creat

推荐