2011-11-17 57 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