Проблема с обратным отсчетом в фоновом режиме в iOS - PullRequest
0 голосов
/ 20 июля 2010

Вот мой код (немного упрощенный).У меня NSTimer срабатывает каждую секунду, что вычитает одно из переменной counter.Когда приложение работает в фоновом режиме, я останавливаю счетчик и сохраняю время, в течение которого счетчик достигнет нуля, до значения NSDefault.

Однако при восстановлении приложения из фона, когда я вычитаю текущее время из «нулевого» времени, я иногда получаю слишком большие значения.Помогите мне найти ошибку, пожалуйста?

- (void)prepareToEnterBackground {
    NSUserDefaults *defaults;
    defaults = [NSUserDefaults standardUserDefaults];

    [defaults setBool:[self timerIsRunning] forKey:@"timer_is_running"];
    [defaults setInteger:workPlayStatus forKey:@"work_play_status"];
    if ([self timerIsRunning]) {
        [defaults setFloat:([[NSDate date] timeIntervalSince1970] + (float) counter) forKey:@"timestamp_for_status_change"];
    } else {
        [defaults setFloat:0.0 forKey:@"timestamp_for_status_change"];
    }

    if (timer!=nil) {
        [timer invalidate];
        timer = nil;
    }
}

- (void)restoreFromBackground {
    NSUserDefaults *defaults;
    defaults = [NSUserDefaults standardUserDefaults];

    NSInteger remainingTimerSeconds;
    if ([defaults integerForKey:@"timer_is_running"]) {
        remainingTimerSeconds = (int) ([defaults floatForKey:@"timestamp_for_status_change"] - [[NSDate date] timeIntervalSince1970]);
        if (remainingTimerSeconds <= 0) {
            remainingTimerSeconds = 0;
        }
    } else {
        remainingTimerSeconds = 0;
    }

    if (remainingTimerSeconds > 0) {
        counter = remainingTimerSeconds;
        workPlayStatus = [defaults integerForKey:@"work_play_status"];
        timer = [NSTimer scheduledTimerWithTimeInterval:1 
            target:self
            selector:@selector(advanceTimer:)
            userInfo:nil
            repeats:YES];
    }
}

1 Ответ

4 голосов
/ 20 июля 2010

Просто предположение - тип NSTimeInterval определен как double, и вы работаете с плавающими в вашем коде, так что вы можете где-нибудь переполниться.Попробуйте изменить float на double, может быть, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...