2016-07-27 5 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を再検証して、それを続けることができます。

関連する問題