2011-11-17 76 views
8

我有一個應用程序應該記錄某些東西,每1秒,我目前使用NSTimer,但如果我的應用程序轉換屏幕(或幾乎任何其他,真的),它減慢了一點點的計時器造成不準確的讀數。NSTimer Reliable Alternatives

什麼是可靠的替代方案?我當前的代碼如下:

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES]; 

回答

12

NSTimer不保證準時按時發射。但是,您可以以比現在更可靠的方式使用NSTimer。當您使用scheduledTimerWithTimeInterval時,您創建了一個NSTimer,它在運行循環中爲NSDefaultRunLoopMode計劃。使用用戶界面時,此模式暫停,因此您的計時器在用戶交互時不會觸發。爲了避免這種暫停,請使用模式NSRunLoopCommonModes。要做到這一點,你必須自己安排計時器,如下所示:

timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
+0

好的,我現在就改變它。我是否像'[timer invalidate]'一樣使計時器失效? – Baub

+0

以這種方式創建的計時器以相同的方式交互。除了你必須手動添加它。當你調用無效時,它應該像以前一樣自動從runloop中移除。 – NJones

4

,你可以:

  • 把的NSTimer在不同的線程
  • 減少的時間間隔((它可能不是由用戶界面,因此受影響)說0.1秒),然後在您的日誌記錄功能中,檢查是否是「正確」時間來記錄您想要的內容。
+0

不是NSTimer創建自己的新線程...?只是問......我在某處讀過它。 –

+1

我不知道,史蒂夫喬布斯。你告訴我。 ;) – Baub

+0

我試着通過調用'performSelectorInBackground'把計時器放到不同的線程中,但它在啓動時不會調用選擇器(我猜是因爲它在不同的線程中)。 – Baub