2016-12-06 47 views
0

我正在使用下面的代碼在2秒內更新一個用戶界面50次,這給出了0.04個時間間隔。然而,updateLabels方法只有5次或6次調用,有時遠不是50次。這是因爲我阻止了任何東西的主線?你們知道如何使它工作嗎?NSTimer不安排足夠多的選擇器的時間

self.timer = [NSTimer timerWithTimeInterval:0.04 
            target:self      
            selector:@selector(updateLabels) 
            userInfo:nil 
            repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; 
+2

您應該閱讀'NSTimer'的文檔。關於重複計時器是如何工作的,有一個全面的討論。 – rmaddy

+0

你怎麼知道updateLabels被稱爲5-6次?是否有可能在該方法內運行持續40ms以上的代碼? – icould

回答

2

就像輪詢不好一樣,反覆推動也是不好的。

正如@rmaddy所說,閱讀關於定時器的文檔以及它們如何工作。

相反,我建議:

  • 指示時間
  • 做一個更新
  • 當更新完成後,請檢查時間流逝
  • 如果>比更新間隔,做一個更新
  • if < than update interval,do a late update

請記住,以上可能不是你想要的,或者。如果您正在更新UIKit視圖,則可能會合並更新並在後臺線程上進行繪製。即當更新計算完成時,屏幕可能未完全繪製。

而且,你真的不想做更新N次第二除非數據真是日新月異,迅速。如果它正在迅速改變,那麼請查看CADisplayLink並構建您的代碼以針對每秒特定幀數的更新速率。如果它沒有那麼快地改變,那麼只有當數據改變時才更新;重繪同樣的東西是浪費電池壽命。