当系统从睡眠中恢复时定时器不会重新启动

问题描述

我正在 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
  }
   
}

我被告知我应该在应用进入睡眠状态时终止计时器,并在它被唤醒时启动它们。但是我还没有找到一种方法来做到这一点。 我尝试使用 applicationDidBecomeActiveapplicationWillResignActive 但它们没有被调用

编辑: 显然这很好用,它让我在系统即将进入睡眠状态时停止计时器并在它醒来时重新启动它们。确认可靠后,我会将其标记为正确答案。

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: 看起来 didWakeNotificationwillSleepNotification 不是很可靠,因为 willSleepNotification 有时会在系统唤醒时被调用

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...