2016-07-27 64 views
0

我正在編寫一個包含通用秒錶計時器的OS X應用程序。我正在使用NSTimer。我希望用戶能夠啓動計時器並在很長時間後(例如30分鐘)回到計時器,並且計時器仍然在運行。問題是我的計時器在計算機關閉或睡着時不能繼續運行,我不想讓計算機長時間保持打開狀態。有關iOS應用程序的這個問題有幾個線程,但沒有(至少我發現)與OS X有關。有誰知道這個問題的解決方法?舉例來說,我試圖模仿iOS附帶的「時鐘」應用程序的「秒錶」功能,除了使用筆記本電腦而不是電話。即使手機長時間關閉,「時鐘」應用程序中的秒錶也會繼續運行。Swift:保持NSTimer在計算機睡着時運行(OSX)

回答

0

我想通過這樣做的方式不是在背景中實際運行NSTimer,而是要了解應用程序進入背景以及回到對焦狀態之間經過了多長時間。使用委託方法applicationWillResignActive:和NSApplicationDelegate的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,以便繼續。