1

このタイマーは、私のすべてのデバイス (5、iPad、および 2 つの 4S) でうまく機能しますが、私が持っている 2 つの 3GS では機能しないようです。何らかの理由で、時間が 3 秒で非常に遅くなります。問題を説明するビデオを次に示します。

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 を 1 秒間に 100 回実行します。

それが正しければ、主に設計上の問題があり、パフォーマンスや NSTimer の問題ではない可能性があります。

NSTimer は時間通りに実行される保証はありません。保証されている唯一のことは、予定よりも早く実行されないことです。

タイマー メソッドがいつ実行されるかわからないため、1 秒間に正確に 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 に答える