在不同设备上与时间的非常有趣的差异

时间:2013-05-18 07:08:52

标签: iphone time nsarray

这个timmer在我的所有设备(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];

请帮我弄清楚这里发生了什么。它在我刚刚丢失的新设备上工作得很好。

提前谢谢!

2 个答案:

答案 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使用两种设备配置您的程序并进行比较。由于您已在演示中隔离了问题,因此它生成的报告应该会快速暴露执行时间差异。一旦了解了最大的问题区域,您就会知道可以更改程序的哪些部分以使其运行得更快。然后将您的更新与初始运行进行比较,以了解速度如何提高。根据需要重复。