我在這一張上找不到任何運氣。當時間變化時,NSDate或其任何兄弟姐妹是否有回調?
這裏的情況是:
我建立一個應用程序,將對它的時鐘,我需要顯示準確的時間;小時,分鐘和秒鐘。
我可以每隔一段時間啓動一次,檢查新時間並進行更新 - 這不是問題。但是......這不準確。它將始終是幾毫秒的關閉,因爲我正在設置秒計數的開始。
問題,有沒有任何類型的回調,協議,委託等,它會告訴程序時間的變化?
我在這一張上找不到任何運氣。當時間變化時,NSDate或其任何兄弟姐妹是否有回調?
這裏的情況是:
我建立一個應用程序,將對它的時鐘,我需要顯示準確的時間;小時,分鐘和秒鐘。
我可以每隔一段時間啓動一次,檢查新時間並進行更新 - 這不是問題。但是......這不準確。它將始終是幾毫秒的關閉,因爲我正在設置秒計數的開始。
問題,有沒有任何類型的回調,協議,委託等,它會告訴程序時間的變化?
只是一個想法,但KVO呢?
[NSDate addObserver:self forKeyPath:@"date" options:0 context:NULL];
我現在沒有訪問IDE的權限,所以我無法測試它。
在另一個說明中,爲什麼您的更新計時器只使用小於1的NSTimeInterval(例如0.1,十次/秒)?
NSTimer是要走的路。
日程吧...
NSTimeInterval interval = 1.0; // the resolution of the clock
[NSTimer scheduledTimerWithTimeInterval:interval
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES];
火災時......
- (void)timerFired:(NSTimer *)timer {
NSDate *now = [NSDate date];
// update your UI knowing now
}
這相對於設備的時間非常準確的將。在分配了當前時間之後,需要一些時間來更新顯示,但是相對於秒分辨率而言,這是一個微不足道的**量。
**並非像光子從屏幕到用戶視網膜所需的時間那麼小,但仍然非常小。
這實際上並不準確,是我現在正在做的。我找到了一個解決方案,我會在這裏發佈它,當我允許我,我是一個新手在這裏:),直到那時,我會鏈接[這個餡餅](http://pastie.org/3707445) – pec1985 2012-04-01 06:46:49
爲什麼你不是在展示你現在在做什麼,並且問題是什麼,以防止人們浪費時間? – jrturton 2012-04-01 07:08:34
@ pec1985,你可以在這個頁面上粘貼一個答案。我很好奇你的意思。接近設備時間?你如何去確認?然後,我想知道你是如何解釋UIKit其餘部分引入的不確定性的,我想知道,如果UI只呈現幾秒鐘,怎麼可能呢? - - 問候。 – danh 2012-04-01 15:59:15
我很抱歉,如果我一開始沒有說清楚的話。我所尋找的不是創建計時器的方法,而是一種使計時器與設備時間完全同步的方法。
所以,這就是我想出了:
NSInteger seconds = ((NSInteger)CFAbsoluteTimeGetCurrent() % 60);
while (true) {
NSInteger currentSeconds = ((NSInteger)CFAbsoluteTimeGetCurrent() % 60);
if(seconds != currentSeconds){
NSLog(@"Seconds changed");
// fire my timer here
break;
}
NSLog(@"currentSeconds: %i",currentSeconds);
seconds = currentSeconds;
}
正如你可以在日誌中看到,的NSLog(@「秒改爲」)踢正好在秒的變化,並在這裏是我可以打電話給我的計時器來啓動1秒的時間間隔,並更新我的用戶界面,等等...... 通過查看日誌的時間戳,秒數被分段,您可以非常容易地得知。
....
2012-04-01 15:02:03.996 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.996 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.997 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.997 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.997 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.998 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.998 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.998 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.999 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.999 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.999 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:04.000 TestApp[75701:f803] Seconds changed
這浪費了大量的CPU時間,因此功耗(=電池壽命)*完全沒有好處*。重複的「NSTimer」可能會如此精確。即使這會導致您的事件處理程序在第二秒的更改而不是毫微秒後發生,但這無濟於事。屏幕只會在運行循環結束時更新,這可能是幾毫秒之後。然後你不能依靠你的設備準確的時間。即使使用NTP時間同步,系統時間的誤差也會超過10毫秒。 – Sven 2012-04-01 19:22:03
@即使我確實看到了你的觀點,但這是儘可能準確的。這裏浪費的CPU時間不會超過一秒,因爲這只是啓動計時器。我在這裏發佈了一個問題,以及我發現的解決方案,看看是否有其他解決方案,因爲我還沒有發現任何準確的東西。謝謝你的評論。 – pec1985 2012-04-01 20:09:39
這是定時器的用途。並使其成爲一個重複的計時器(每秒一次),並且將如您所期望的那樣精確。 – 2012-04-01 04:00:43
對於那些需要準確時間的用戶應有的尊重,他們是否會注意到您的時鐘已關閉10毫秒?真?只需設置一個計時器並使用'[NSDate date]'更新您的顯示器。 – Costique 2012-04-01 05:49:26
@Costique我是那個用戶。 – pec1985 2012-04-01 06:37:10