Чтобы получить доступ к потоку извне метода startTimerThread
, вы должны добавить свойство в свой класс. Я бы предложил свойство over ivar, потому что вы можете автоматически синтезировать атомарные аксессоры. То, что вы делаете с таймером, зависит от того, хотите ли вы приостановить или остановить его.
Остановка таймера означает, что при следующем запуске он запустится с оставшимися 3 секундами. Это означает, что если таймер сработает через 1 секунду, когда вы его остановите, то после запуска снова все равно будет 3 секунды. Однако остановиться очень просто. A stopTimerThread
будет определяться следующим образом:
- (void)stopTimerThread {
NSTimer *theTimer = self.timer;
[theTimer invalidate];
self.timer = nil;
}
Поскольку у runloop в другом потоке нет источников, он автоматически завершится и поток закончится, поэтому вы можете использовать startTimerThread
, когда захотите запустить его снова.
Приостановка таймера означает, что, если он сработает через 1 секунду, когда вы его приостановите, он сработает через 1 секунду после перезапуска. Для этого вам также понадобится свойство, содержащее время, оставшееся до срабатывания таймера, которое будет установлено в stopTimerThread
и использовано в startTimerThread
. Реализация stopTimerThread
выглядит следующим образом:
- (void)stopTimerThread {
NSTimer *theTimer = self.timer;
NSDate *fireDate = [theTimer fireDate];
[theTimer invalidate];
self.timerTimeRemaining = - [fireDate timeIntervalSinceNow];
self.timer = nil;
}
Обратите внимание, что оставшееся время установлено как отрицательное значение временного интервала, поскольку дата срабатывания будет раньше. Вам также придется изменить startTimerThread
, чтобы учесть оставшееся время при настройке таймера.
- (void)startTimerThread {
// set up autorelease pool, get run loop
NSTimeInterval timeLeft = self.timerTimeRemaining;
if(timeLeft <= 0.0) timeLeft = 3.0;
NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:timeLeft];
NSTimer *theTimer = [[NSTimer alloc] initWithFireDate:fireDate interval:3.0 target:self selector:@selector(loadNextPhoto) userInfo:nil repeats:YES];
[runLoop addTimer:theTimer forMode:NSDefaultRunLoopMode];
self.timer = theTimer;
[theTimer release];
[runLoop run];
// clean up
}