Swift:在计算机睡眠时保持NSTimer运行(OSX)

时间:2016-07-27 17:20:37

标签: macos timer nstimer background-process

我正在编写一个包含通用秒表计时器的OS X应用程序。我正在使用NSTimer。我希望用户能够启动计时器并在很长一段时间后(例如30分钟)返回计时器,并且计时器仍然会运行。问题是我的计时器在计算机关闭或睡眠时不会继续运行,我不想长时间保持计算机打开和打开状态。有关iOS应用程序的这个问题有几个线程,但没有(至少我发现)与OS X有关。有没有人知道这个问题的解决方法?作为一个例子,我试图模仿iOS附带的“时钟”应用程序的“秒表”功能,除了笔记本电脑而不是手机。即使手机长时间关机,“时钟”应用程序中的秒表也会继续运行。

1 个答案:

答案 0 :(得分:1)

我想出这样做的方法不是在后台实际运行NSTimer,而是要知道应用程序进入后台和重新进入后台之间经过了多长时间焦点。使用NSApplicationDelegate的委托方法applicationWillResignActive:applicationWillBecomeActive:

let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self), userInfo: nil, repeats: true)
var resignDate: NSDate?
var stopwatch = 0

func update() {
    stopwatch += 1
}

func applicationWillResignActive(notification: NSNotification) {
    timer.invalidate()
    resignDate = NSDate() // save current time 
}

func applicationWillBecomeActive(notification: NSNotification) {
    if resignDate != nil {
        let timeSinceResign = NSDate().timeIntervalSinceDate(resignDate!))
        stopwatch += Int(timeSinceResign)
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self), userInfo: nil, repeats: true)
        resignDate = nil
    }
}
每次应用失焦时都会调用

applicationWillResignActive:。发生这种情况时,我将当前日期(NSDate())保存在名为resignDate的变量中。然后,当应用程序重新激活时(在谁知道多长时间之后;无关紧要)调用applicationWillBecomeActive:。然后,我取另一个NSDate值作为当前时间,我找到当前时间与resignDate之间的时间量。将这段时间添加到我的时间值之后,我可以重新验证并NSTimer以便它继续运行。