Iphone NSTimer可靠的替代方案

Iphone NSTimer可靠的替代方案,iphone,objective-c,ios,nstimer,Iphone,Objective C,Ios,Nstimer,我有一个应用程序,应该每1秒记录一次某些事情,我目前正在使用NSTimer,但是如果我的应用程序转换屏幕(或者几乎其他任何东西),它会使计时器慢一点,导致读数不准确 什么是可靠的替代品?我目前的代码如下: timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES]; 你可以: 将NSTimer放在另一个线程中(这样它可能

我有一个应用程序,应该每1秒记录一次某些事情,我目前正在使用
NSTimer
,但是如果我的应用程序转换屏幕(或者几乎其他任何东西),它会使计时器慢一点,导致读数不准确

什么是可靠的替代品?我目前的代码如下:

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

  • 将NSTimer放在另一个线程中(这样它可能不会受到UI的影响)
  • 缩短间隔(比如0.1秒),在日志功能中,检查是否是记录所需内容的“正确”时间

NSTimer不能保证准时开火。但是,您可以用比现在更可靠的方式使用NSTimer。使用
scheduledTimerWithTimeInterval
时,将创建一个NSTimer,该NSTimer在
NSDefaultRunLoopMode
的运行循环中调度。此模式在使用UI时暂停,因此当存在用户交互时,计时器不会触发。要避免此暂停,请使用模式
NSRunLoopCommonModes
。为此,您必须自己安排计时器,如下所示:

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

NSTimer不创建自己的新线程吗。。。?只是问一下……我在某个地方读到了它。我试图通过调用
performSelectorInBackground
将计时器放在不同的线程中,但它在启动时不会调用选择器(我猜是因为它在不同的线程中)。@Steve:
NSTimer
不会创建自己的线程。它在创建它的线程上运行。减少间隔是一个很好的解决方案
NSTimer
。也可以尝试一下中央大调度(GCD)。它也可以用来创建计时器。也许他们会更可靠。好吧,我现在就把这个换掉。我是否以相同的方式使计时器无效
[timer invalidate]
?以这种方式创建的计时器的交互作用相同。除了你必须手动添加它。当您调用invalidate时,它应该像以前一样自动从runloop中删除。