2010-01-30 64 views
1

我開發了一個應用程序,我正在運行倒數計時器。計時器每秒鐘都會觸發一個方法。但是,當手機處於睡眠模式時,計時器會變慢甚至關閉。如何使用NSDate運行倒計時?

我想我需要通過使用NSDate計算時間間隔來更新變量。有人知道如何做到這一點?

順便說一句,我們的客戶發送了以下意見:

計時器問題似乎是由該代碼假定 的計時器通知消息 正好1秒交付的事實,引起 ,但 不是。當應用程序運行但 手機處於待機狀態時,它使用 計時器更新倒數計時器。 但是,定時器進入緩慢 比一秒鐘,所以倒計時 定時器關閉。該應用程序應該重寫爲 ,以始終根據當前的 時間更新 倒計時計時器,並且不會基於計時器消息本身倒計時。 (在其他 也就是說,當一個第二消息 到來時,總是假設 額外的時間已經過去了, 通過 從目標時間減去計算剩餘時間該 是當你重新啓動 應用發生了什麼 - - 它計算出的目標時間 和當前時間,減去從另一個 ,並更新 屏幕上的計時器好了,這是怎麼了 應該始終做到這一點)

如果有人瞭解。我們確實需要,請告訴我。

回答

5

NSTimers永遠不應該用於真正保持時間。它們依賴於運行循環,因此可能會被需要很長時間運行的代碼干擾。

您應該停止applicationWillResignActive:中的計時器並在applicationDidBecomeActive:中恢復(實際上是創建另一個計時器)。

要計算你需要的東西,如日期:

NSDate *startDate=[NSDate date]; 
    NSDate *endDate=[startDate addTimeInterval:someSeconds]; 
    NSTimeInterval secsElapsed; 
    ... 

-(void) timerDidFire:(NSTimer *) aTimer{ 
    NSDate *dateNow=[NSDate date]; 
    if ([[dateNow laterDate:endDate] isEqual:endDate]) { 
     [aTimer invalidate]; 
     // end countdown 
    }else { 
     secsElapsed=[dateNow timeIntervalSinceDate:startDate]; 
    } 
} 
2

使用紀元時間。大紀元是因爲Janury 1日的秒數,1970年

程序啓動時,保存當前時代的時間

double start = [[NSDate date] timeIntervalSince1970]; 

然後當你更新你的計時器,

double running = [[NSDate date] timeIntervalSince1970] - start; 

威爾告訴你自start以來已經過了多少秒鐘。

+2

[NSDate的日期] _is_當前時間。 – 2010-01-30 14:08:11

+0

啊,謝謝,我不確定 – 2010-01-30 19:04:56