2012-06-18 1 views
1

У меня есть повторяющийся таймер, который работает по часам. Во время работы часов я вызываю stopTimer, и часы должны останавливаться. Это на 100% работает на iPhone, однако на iPad он иногда не сможет остановить таймер. Это происходит примерно в 50% случаев. NSLogs вызывается в методе остановки.NSTimer не будет недействительным на iPad, но отлично работает на iPhone

Вот мой код таймера:

- (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]; 
+0

Есть ли в вашем приложении прокрутка во время таймера? Это запускает другой тип runloop, который может привести к тому, что таймер не будет запускаться или не запускаться поздно. – kevboh

+0

Да, вся игра основана на прокрутке! Таймер срабатывает просто отлично, потому что часы обновляются каждые 0,01 секунды. Я проверил свойство .isValid и он действителен, поэтому проблема должна быть запущена. Почему это будет только на iPad? И что я могу сделать, чтобы обойти его (запустить таймер в другом цикле запуска?) – Darren

+0

Простите, это не прокрутка, я использую UISliders. – Darren

ответ

1

Создайте таймер без планирования с помощью метода +timerWith..., а затем назначьте его на runloop самостоятельно, используя [[NSRunLoop currentRunLoop] addTimer:timer forMode: NSRunLoopCommonModes], чтобы запустить его на всех runloops. Дай мне знать, если это работает.

+0

Я пробовал это как раз перед тем, как вы написали его здесь. Я пробовал использовать как mainRunLoop, так и currentRunLoop, но это не помогает. Таймер работает нормально, он просто не останавливается. – Darren

+0

Хм. Убедитесь, что обратный вызов таймера выглядит как (void) timerFireMethod: (NSTimer *) theTimer. – kevboh

+0

Теперь я так глуп. В таймере нет ничего плохого! Потому что я только считал минус 1 секунду, это было трудно заметить, но я не сбрасывал int до 0, прежде чем начинать новую игру! Doh! Извините, но спасибо все равно. – Darren

0

Для игры, возможно, вы должны использовать CADisplayLink вместо NSTimer.

Смежные вопросы