我一直在使用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。
有什么建议吗?
干杯!
答案 0 :(得分:1)
如果您阅读-performSelector上的文档:withObject:afterDelay:它不能保证消息在0.01秒延迟后正好发送。相反,它表示消息在0.01秒后被置于事件队列中,并在轮到它时被触发。
使用NSTimer的方法+ scheduledTimerWithTimeInterval可能会更好:target:selector:userInfo:重复:。
尽管计时器在当前运行循环中的工作方式与performSelector类似,但至少它不会在0.01 +执行(执行-Time方法体所花费的时间)。
请注意,您只需要调用该NSTimer方法一次,并使用其返回值使计时器无效。