Как запустить обратный отсчет с помощью NSDate? - PullRequest
1 голос
/ 30 января 2010

Я разработал приложение, в котором я запускаю таймер обратного отсчета. Таймер запускает метод каждую секунду. Однако, когда телефон находится в спящем режиме, таймер замедляется или даже выключается.

Я думаю, что мне нужно обновить переменные путем вычисления временных интервалов с использованием NSDate. Кто-нибудь знает, как это сделать?

Кстати, наш клиент прислал следующий отзыв:

Кажется, проблема с таймером тот факт, что код предполагает, что сообщения таймера доставлено ровно за одну секунду, но нет. Когда приложение работает, но телефон находится в режиме ожидания, он использует таймер для обновления таймера обратного отсчета. Но таймер приходит медленнее чем одна секунда, поэтому обратный отсчет таймер выключен Приложение должно быть переработан, чтобы всегда обновлять таймер обратного отсчета на основе текущего время, а не обратный отсчет на основе сами сообщения таймера. (В других слова, когда одна секунда сообщения приходит, всегда предполагайте, что дополнительное время прошло и рассчитать оставшееся время вычитая из целевого времени. это это то, что происходит, когда вы перезапустите приложение - оно вычисляет целевое время и текущее время вычитает один от другого, и обновляет экранный таймер. Ну вот как это всегда должен делать это.)

Если кто-то понимает, что именно нам нужно, пожалуйста, скажите мне.

Ответы [ 2 ]

5 голосов
/ 30 января 2010

NSTimers никогда не должны использоваться, чтобы действительно держать время. Они зависят от цикла выполнения и поэтому могут вмешиваться в код, выполнение которого занимает много времени.

Вы должны остановить таймер в applicationWillResignActive: и возобновить (фактически, создать еще один таймер) в applicationDidBecomeActive:.

Для расчета дат вам нужно что-то вроде:

    NSDate *startDate=[NSDate date];
    NSDate *endDate=[startDate addTimeInterval:someSeconds];
    NSTimeInterval secsElapsed;
    ...

-(void) timerDidFire:(NSTimer *) aTimer{
    NSDate *dateNow=[NSDate date];
    if ([[dateNow laterDate:endDate] isEqual:endDate]) {
        [aTimer invalidate];
        // end countdown
    }else {
        secsElapsed=[dateNow timeIntervalSinceDate:startDate];
    }
}
2 голосов
/ 30 января 2010

Используйте время эпохи. Время эпохи - это количество секунд с 1 января 1970 года.

Когда программа запустится, сохраните текущее время эпохи

double start = [[NSDate date] timeIntervalSince1970];

А потом, когда вы обновите свой таймер,

double running = [[NSDate date] timeIntervalSince1970] - start;

Скажет вам, сколько секунд прошло с start.

...