1

私は、クロックを実行する繰り返しタイマーを持っています。クロックがダウンしている間に stopTimer を呼び出すと、クロックが停止するはずです。これは iPhone では 100% 機能しますが、iPad ではタイマーの停止に失敗することがあります。これは約 50% の確率で発生します。NSLog は stop メソッドで呼び出されます。

これが私のタイマーコードです:

- (void)startSliderTimer
{
    // Get start time
    [self stopTimer];
    startTime = [NSDate timeIntervalSinceReferenceDate] + kmaxTimePerSlider;
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(updateClock) userInfo:nil repeats:YES];
}

- (void)updateClock
{
    NSTimeInterval currentTimer = [NSDate timeIntervalSinceReferenceDate];
    NSTimeInterval currentTimeLeft = startTime - currentTimer;
    if (currentTimeLeft >= 0) {
        int seconds = currentTimeLeft;
        float milliseconds = currentTimeLeft - seconds;
        int mill = milliseconds * 1000;
        NSString* displayTime = [NSString stringWithFormat: @"%02d:%03d",seconds,mill];
        timerLbl.text = displayTime;
    } else {
        [self tooSlow];
    }
}

- (void) stopTimer
{
    NSLog(@"%s",__FUNCTION__);
    if (self.timer) {
        NSLog(@"Stop Timer");
        [self.timer invalidate];
        self.timer = nil;
    }
}

別の質問/回答の提案として、このようにタイマーを実行しようとしましたが、それでも常に無効になるとは限りません:

self.timer = [NSTimer timerWithTimeInterval:0.01f target:self selector:@selector(updateClock) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
4

2 に答える 2

1

+timerWith...メソッドを使用してスケジュールせずにタイマーを作成し、[[NSRunLoop currentRunLoop] addTimer:timer forMode: NSRunLoopCommonModes]すべての実行ループで実行するために自分で実行ループでスケジュールします。それがうまくいくかどうか教えてください。

于 2012-06-18T21:03:04.980 に答える
0

ゲームの場合、おそらく NSTimer の代わりに CADisplayLink を使用する必要があります。

于 2012-06-18T21:27:05.457 に答える