1

HH:mm:ss 形式で 0 からカウントアップするストップウォッチ スタイルのアプリを使用しています。コードは私には非常に単純に見えますが、これ以上効率的に実行する方法は思い浮かびません。

何らかの理由で、タイマーを実行すると、タイマーが 00:00:02 になると、非常に顕著で一貫した (同じ場所で実行するたびに) 遅延が発生します。00:00:02 に 1 秒間とどまり、その後は通常どおりカウントされます。なぜこれが起こるのでしょうか?

-(IBAction)startAndStop;
{
if (!timer) {
    NSLog(@"Pressing Start Button");
    [startAndStopButton setTitle:@"Stop" forState:0];
    startDate = [[NSDate date] retain];
    timerLabel.text = @"00:00:00";
    timer = [NSTimer scheduledTimerWithTimeInterval:1 
                                             target:self
                                           selector:@selector(timerStart) 
                                           userInfo:nil 
                                            repeats:YES];

    } else {

    NSLog(@"Pressing Stop Button");
    [startAndStopButton setTitle:@"Start" forState:0];
    [startDate release];
    [timer invalidate];
    timer = nil;
    [timer release];
    }
}

-(void)timerStart
{
    NSDate *currentDate = [NSDate date];
    NSTimeInterval countInSeconds = [currentDate timeIntervalSinceDate:startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSinceReferenceDate:countInSeconds];

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"HH:mm:ss"];
    [df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    NSString *timeString = [df stringFromDate:timerDate];
    [df release];
    timerLabel.text = timeString;
}
4

2 に答える 2

1

NSTimer は、正確な時刻または時間間隔で起動しません (エラーの仕様を確認してください)。したがって、最も近い秒に四捨五入すると、同じクロック秒内に 1 回の遅い発火と 1 回の早い発火が発生する可能性があり、スタッター効果が見られます。

代わりに、たとえば 30 Hz などのはるかに高速なタイマー (または CADisplaylink) を使用して、時間を確認し、時間がラベルを変更するのに十分な時間 (1 秒) に変更された場合にのみラベルを更新します。

于 2011-05-12T18:18:20.663 に答える
0

渡す間隔は秒単位です。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html

私の推測では、タイマー間隔として 1 秒を渡しているため、すぐに呼び出され、その後は 1 秒ごとに呼び出されます。1.0/20.0 などを渡して、より高いフレーム レートで更新してみてください。

于 2011-05-12T18:17:23.457 に答える