这个timmer在我的所有设备(5,Ipad和两个4S)上运行良好,但它似乎不适用于我拥有的两个3GS。出于某种原因,时间在3s上运行得非常慢。 下面是一段解释问题的视频:
继承了处理时间的代码:
- (void)showTime
{
int hours = 0;
int minutes = 0;
int seconds = 0;
int hundredths = 0;
NSArray *timeArray = [NSArray arrayWithObjects:self.hun.text, self.sec.text, self.min.text, self.hr.text, nil];
for (int i = [timeArray count] - 1; i >= 0; i--) {
int timeComponent = [[timeArray objectAtIndex:i] intValue];
switch (i) {
case 3:
hours = timeComponent;
break;
case 2:
minutes = timeComponent;
break;
case 1:
seconds = timeComponent;
break;
case 0:
hundredths = timeComponent;
hundredths++;
score++;
break;
default:
break;
}
}
if (hundredths == 100) {
seconds++;
hundredths = 0;
}
else if (seconds == 60) {
minutes++;
seconds = 0;
}
else if (minutes == 60) {
hours++;
minutes = 0;
}
self.hr.text = [NSString stringWithFormat:@"%.0d", hours];
self.min.text = [NSString stringWithFormat:@"%.2d", minutes];
self.sec.text = [NSString stringWithFormat:@"%.2d", seconds];
self.hun.text = [NSString stringWithFormat:@"%.2d", hundredths];
scoreLabel.text= [NSString stringWithFormat:@"%i",score];
请帮我弄清楚这里发生了什么。它在我刚刚丢失的新设备上工作得很好。
提前谢谢!
答案 0 :(得分:1)
如果我正确理解您的代码,您每秒运行NSTimer 100次。
如果这是正确的,您可能主要遇到设计问题,而不是性能或NSTimer问题。
不保证NSTimer按时运行。唯一能保证的是它不会早于预期运行。
由于您不知道计时器方法何时运行,因此您无法依赖它每秒运行100次。这意味着计时器是一种“计算”时间的坏方法。更好的方法是在启动计时器时节省系统时间,当您想知道已经过了多长时间时,使用当前系统时间并减去开始时间。 NSTimer仅用于显示目的。
这样的事情:
// instance variables:
NSDate *startDate;
NSTimer *timer;
- (void)startTimer {
[timer invalidate];
startDate = [NSDate date]; // save current time
timer = [NSTimer timerWithTimeInterval:0.075 target:self selector:@selector(displayTime:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
- (void)displayTime:(NSTimer *)timer {
// the timer method is for display only. it doesn't "count" time
// calculate elapsed time from start time
NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:startDate];
NSInteger ti = (NSInteger)elapsedTime;
// convert elapsed time (in seconds) into hours, minutes, seconds ...
double fractionalSeconds = fmod(elapsedTime, 1);
NSInteger hundreds = fractionalSeconds * 100;
NSInteger seconds = ti % 60;
NSInteger minutes = (ti / 60) % 60;
NSInteger hours = (ti / 3600);
NSLog(@"%02d:%02d:%02d.%02d", hours, minutes, seconds, hundreds);
}
答案 1 :(得分:0)
使用Instruments.app使用两种设备配置您的程序并进行比较。由于您已在演示中隔离了问题,因此它生成的报告应该会快速暴露执行时间差异。一旦了解了最大的问题区域,您就会知道可以更改程序的哪些部分以使其运行得更快。然后将您的更新与初始运行进行比较,以了解速度如何提高。根据需要重复。