问题描述
我正在 Swift 中为 MACOS 制作一个 Launch Daemon 应用程序。此应用程序需要每隔几分钟向 api 发出一次请求。我使用计时器执行此操作,但我遇到过在某些用户机器上,一旦系统从睡眠状态恢复,计时器不会重新启动。我还有其他具有相同行为的重复计时器,因此它不仅仅与一个相关。发生这种情况时,应用程序不会崩溃,只是计时器不会再次触发。
这是我使用的计时器:
class RepeatingTimer {
public var timer: dispatchSourceTimer?
init(interval: Int,queue: dispatchQueue,deadline: dispatchTime = .Now(),eventHandler: @escaping ()-> Void) {
timer = dispatchSource.makeTimerSource(flags: [],queue: queue)
timer?.schedule(deadline: deadline,repeating: .seconds(interval))
timer?.setEventHandler {
eventHandler()
}
}
func start() {
timer?.resume()
}
func stop() {
timer = nil
}
}
我被告知我应该在应用进入睡眠状态时终止计时器,并在它被唤醒时启动它们。但是我还没有找到一种方法来做到这一点。
我尝试使用 applicationDidBecomeActive
和 applicationWillResignActive
但它们没有被调用。
编辑: 显然这很好用,它让我在系统即将进入睡眠状态时停止计时器并在它醒来时重新启动它们。确认可靠后,我会将其标记为正确答案。
NSWorkspace.shared.notificationCenter.addobserver(self,selector: #selector(recieveSleepNotification),name: NSWorkspace.willSleepNotification,object: nil)
NSWorkspace.shared.notificationCenter.addobserver(self,selector: #selector(recieveWakeNotification),name: NSWorkspace.didWakeNotification,object: nil)
@objc func recieveSleepNotification(sender: AnyObject){
// Stop Timers
}
@objc func recieveWakeNotification(sender: AnyObject){
// Start Timers
}
编辑 2:
看起来 didWakeNotification
和 willSleepNotification
不是很可靠,因为 willSleepNotification
有时会在系统唤醒时被调用。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)