NSTimer不会在iPad上失效,但在iPhone上运行正常

时间:2012-06-18 20:30:34

标签: objective-c ios xcode nstimer

我有一个按时钟运行的重复计时器。在时钟运行期间,我调用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];

2 个答案:

答案 0 :(得分:1)

创建计时器而不使用+timerWith...方法安排计时器,然后使用[[NSRunLoop currentRunLoop] addTimer:timer forMode: NSRunLoopCommonModes]在runloop上自行安排计时器在所有runloops上运行它。如果有效,请告诉我。

答案 1 :(得分:0)

对于游戏,也许您应该使用CADisplayLink而不是NSTimer。