Последовательная задержка в 1 секунду в 0:02 во время NSTimer в приложении, напоминающем секундомер - PullRequest
1 голос
/ 12 мая 2011

У меня есть приложение, которое использует счетчик секундомеров в формате ЧЧ: мм: сс. Код выглядит довольно простым для меня, и я не могу придумать более эффективный способ его запуска.

По какой-то причине, когда я запускаю его, наблюдается очень заметное и последовательное (каждый раз, когда я запускаю его в одном и том же месте) отставание, когда таймер достигает 00:00:02. Он остается на 00:00:02 в течение полной секунды, а затем рассчитывается в обычном режиме. Почему это случилось?

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

Ответы [ 2 ]

1 голос
/ 12 мая 2011

NSTimer не срабатывает в точное время или через определенные промежутки времени (проверьте спецификацию на предмет вероятной ошибки).Таким образом, возможно, что одно позднее срабатывание и одно раннее срабатывание произойдут в течение одной и той же тактовой секунды, при округлении до ближайшей секунды, и вы увидите эффект заикания.

Вместо этого используйте гораздо более быстрый таймер (илиCADisplaylink), скажем, с частотой 30 Гц, проверьте время и обновляйте метку, только если время изменилось достаточно для смены метки (одна секунда).

0 голосов
/ 12 мая 2011

Интервал, который вы проходите в секундах:

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

Я предполагаю, что он вызывается сразу, а затем каждые 1 секунду,так как вы передаете 1 секунду как интервал таймера.Попробуйте передать что-то вроде 1.0 / 20.0 для обновления с более высокой частотой кадров.

...