Наиболее практичный способ сделать это - подделать его, то есть просто сохранить начальную метку времени и не пытаться постоянно поддерживать какие-либо переменные timePassed
. Это и проще для написания кода, и на самом деле более надежно, так как оно стабильно.
Сохраните NSDate
для того момента, когда таймер был запущен, и всякий раз, когда вы хотите отобразить или обновить таймер, используйте метод NSDate
timeIntervalSinceNow
, который возвращает количество секунд передается как NSTimeInterval
, что в основном является typedef для double. Примечание: эта функция возвращает отрицательное число при вызове на временной отметке в прошлом, что будет иметь место здесь.
Если часть вашего дисплея показывает это время, вы можете обновлять его каждую секунду (или даже чаще) с помощью объекта NSTimer
, который периодически вызывает один из ваших методов, который обновляет дисплей.
Пример кода:
// In the initialization code:
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self
selector:@selector(secondPassed:) userInfo:nil repeats:YES];
// Later:
// (This code assumes #minutes < 60.)
- (void) secondPassed: (NSTimer:) timer {
NSTimeInterval secondsPassed = -1 * [self.timerStart timeIntervalSinceNow];
int minutes = (int)(secondsPassed / 60);
int seconds = (int)(seconds - minutes * 60);
NSString* timerString = [NSString stringWithFormat:@"%02d:%02d",
minutes, seconds];
[self updateTimerDisplay:timerString];
}