1

这个定时器在我所有的设备(5 个、Ipad 和两个 4S)上都很好用,但它似乎不适用于我拥有的两个 3GS。出于某种原因,3s 上的时间真的很慢。这是解释问题的视频:

http://youtu.be/4vdusgnIXcs

这是处理时间的代码:

   - (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];

请帮我弄清楚这里发生了什么。它在较新的设备上运行良好,我只是迷失了我需要做的事情。

先感谢您!

4

2 回答 2

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);
}
于 2013-05-18T10:13:19.577 回答
0

使用这两种设备使用 Instruments.app 分析您的程序并进行比较。由于您已经在演示中隔离了问题,因此它生成的报告应该会快速显示执行时间差异。一旦您了解了最大的问题区域,您就会知道可以更改程序的哪些部分以使其运行得更快。然后将您的更新与初始运行进行比较,看看速度是如何提高的。根据需要重复。

于 2013-05-18T07:15:25.477 回答