2012-03-16 82 views
0

我正在做一個需要定時器的應用程序。我嘗試過NSTimer,但NSTimer總是丟失或被延遲。 iOS SDK中是否有類可以準確記錄時間?準確度在20ms到40ms之間是可以的。我希望能夠在固定的時間間隔內更改圖像。如何在ios中獲得準確的定時器

NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:.04f target:self selector:@selector(timer1) userInfo:nil repeats:YES]; 
- (void)timer1 
{ 
    NSLog(@"timer1 timer %@",[NSDate date]); 
} 
+10

您的期限和換檔鑰匙是否損壞? – dasdom 2012-03-16 13:13:59

+0

問題不在於計時器的準確性,而在於從計時器觸發到服務例程被調用時的排隊延遲。如果您正在使用在UI線程中運行的方案,那麼無法解決這個問題。 – 2013-07-28 12:12:38

回答

3

NSTimer不是高分辨率定時器。從NSTimer類文檔:

因爲一個典型的運行循環管理的各種輸入源,用於定時器的時間間隔的有效分辨率被限制爲50-100毫秒的數量級上。

除了@CJ Foley建議的鏈接,您可以查看dispatch_after函數。

+0

+1 - 我的想法確切! – 2012-03-16 14:22:03

+0

我也在nstimer類的文檔中看到了這個,所以我想找到一些有效的類來獲得準確的時間間隔來做一些週期性的動作 – joebo 2012-03-17 04:32:59

+0

由於bcattle的回答表明,dispatch_after不保證在某個時間執行,只有_after_一定的時間。 'CADisplayLink'是一個更好的選擇。 – Bernem 2016-05-04 15:44:20

0

由於您如何測試NSDate,您的結果可能是否定的?

This question討論瞭如何從NSDate獲得毫秒精度。

+1

NSDate確實是一個很好的課程,可以獲得準確的時間,但在我的問題中,我希望獲得準確的時間間隔來執行一些週期性操作,就像nstimer – joebo 2012-03-17 04:26:23

3

爲此使用CADisplayLink。它以系統幀速率觸發:60 fps或17 ms。

如果你想要更長的時間間隔,你可以將它設置爲以幀頻的倍數激發,例如,每2幀或3幀。

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(timer1)]; 
displayLink.frameInterval = 2; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

它的意思是用於應該更新每個ň幀UI。

請勿使用dispatch_after。正如名字所暗示的那樣,唯一的保證是你的區塊將在之後的特定時間執行。如果有什麼東西阻塞線程,你的塊將不得不等待。

+0

這非常有用,我不知道它現在存在。我在Windows環境中嘗試了很多年,嘗試使刷新率與動畫正確同步,並且這是由刷新率驅動的這個簡單的iOS組件。 – MusiGenesis 2015-04-29 21:15:12