使用xcode计时器时出错

使用xcode计时器时出错,xcode,timer,skip,Xcode,Timer,Skip,我一直在使用Xcode来实现一个计时器,并根据时间运行计算。但是,计时器每隔一段时间就会跳过一次迭代,这会使所有的计算都中断 - (void)Time { if (running==false) return; NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate]; NSTimeInterval elapsed = currentTime - startTime; int mins = (i

我一直在使用Xcode来实现一个计时器,并根据时间运行计算。但是,计时器每隔一段时间就会跳过一次迭代,这会使所有的计算都中断

- (void)Time
{

  if (running==false) return;

  NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];
  NSTimeInterval elapsed = currentTime - startTime;

  int mins = (int) (elapsed / 60.0);

  elapsed -= mins* 60;
  int seconds = (int) (elapsed);
  elapsed -= seconds;
  int fraction = elapsed * 100.0;
  beepTime = [self Dec:seconds+elapsed];



  [self mod];



  label.text= [NSString stringWithFormat:@"%u:%02u.%.01u",mins,seconds,fraction/10];



  [self performSelector:@selector(Time) withObject:nil afterDelay:0.01];


}
下面是一些日志的小样本

2012-08-14 20:25:04.659  RT 8.470000  BP 50.710000 MT 8.360000
2012-08-14 20:25:04.671  RT 8.470000  BP 50.720000 MT 8.370000
2012-08-14 20:25:04.682  RT 8.470000  BP 50.740000 MT 8.390000
请注意,已跳过BP 50.730000和MT 8.380000

有什么建议吗


干杯

如果您阅读了-performSelector:withObject:afterDelay:上的文档,则无法保证消息在0.01秒延迟后准确发送。相反,它表示消息在0.01秒后放入事件队列,并在轮到它时触发

您最好使用NSTimer的方法+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

Eventhough计时器在当前运行循环中的工作方式与performSelector类似,至少它不会在0.01+中执行(执行-time方法体所花费的时间)

请注意,您只需要调用NSTimer方法一次,并使用其返回值使计时器无效