1

我有一个应用程序,它使用从 0 开始的秒表式计数,采用 HH:mm:ss 格式。代码对我来说看起来很简单,我想不出更有效的方法来运行它。

出于某种原因,当我运行它时,当计时器到达 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;
}
4

2 回答 2

1

NSTimer 不会在确切的时间或时间间隔触发(检查规范以了解可能的错误)。因此,当四舍五入到最接近的秒时,可能会在同一时钟秒内发生一次延迟发射和一次提前发射,您将看到卡顿效果。

相反,使用更快的计时器(或 CADisplaylink),例如 30 Hz,检查时间,并仅在时间变化到足以更改标签(一秒)时更新标签。

于 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 回答