Macos Swift:在计算机处于睡眠状态时保持NSTimer运行(OSX)
我正在编写一个OSX应用程序,其中包括一个通用的秒表计时器。我正在使用Macos Swift:在计算机处于睡眠状态时保持NSTimer运行(OSX),macos,timer,nstimer,background-process,Macos,Timer,Nstimer,Background Process,我正在编写一个OSX应用程序,其中包括一个通用的秒表计时器。我正在使用NSTimer。我希望用户能够启动计时器,并在很长一段时间(比如30分钟)后返回,并且计时器仍在运行。问题是,我的计时器在电脑关闭或休眠时无法继续运行,我不想让电脑长时间处于打开状态。关于iOS应用程序的这个问题,有好几个线程,但没有一个(至少我已经发现)与OS X有关。有人知道这个问题的解决方法吗?举个例子,我试图模仿iOS自带的“时钟”应用程序的“秒表”功能,除了笔记本电脑而不是手机。即使手机长时间关机,“时钟”应用程序中
NSTimer
。我希望用户能够启动计时器,并在很长一段时间(比如30分钟)后返回,并且计时器仍在运行。问题是,我的计时器在电脑关闭或休眠时无法继续运行,我不想让电脑长时间处于打开状态。关于iOS应用程序的这个问题,有好几个线程,但没有一个(至少我已经发现)与OS X有关。有人知道这个问题的解决方法吗?举个例子,我试图模仿iOS自带的“时钟”应用程序的“秒表”功能,除了笔记本电脑而不是手机。即使手机长时间关机,“时钟”应用程序中的秒表也会继续运行。我想这样做的方法不是在后台实际运行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
的变量中。然后,当应用程序被重新激活时(在谁知道多长时间之后;这无关紧要)应用程序将变为活动状态:
被调用。然后,我取另一个NSDate
值,即当前时间,并找到当前时间和resignDate
之间的时间量。在将这段时间添加到我的时间值后,我可以重新验证NSTimer
,使其继续运行