Запустите повторяющийся таймер, когда applicationDidEnterBackground - PullRequest
3 голосов
/ 30 июня 2011

Моя цель - запускать повторяющийся таймер каждые пять секунд, если и только если приложение работает в фоновом режиме.Я попробовал пару идей, но они, похоже, не работают.

Идея 1. Не запускается ни разу.

- (void)applicationDidEnterBackground:(UIApplication *)application {

    [NSTimer scheduledTimerWithTimeInterval:(5.0/5.0) target:self selector:@selector(check_expiry) userInfo:nil repeats:YES];

}

Идея 2: Запускается каждые пять секунд, но я не могу остановить цикл.

- (void)applicationDidEnterBackground:(UIApplication *)application {
    counter = YES;
    while (counter) {
        sleep(5);
        [self check_expiry];
    }
    // Counter is set to NO in willEnterForeground and didBecomeActive, but this loop continues to run due the sleep();
}

Как мне заставить этот цикл работать правильно?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Когда приложение «входит в фон» в iOS, это не похоже на обычные операционные системы, где оно продолжает работать. Приложение переходит в приостановленное состояние. Это не продолжает бежать; сохраняется только состояние приложения, и даже это не гарантируется - если устройству не хватает памяти, iOS с радостью завершит работу вашего приложения, чтобы передать память активному приложению. Если вы попытаетесь заблокировать applicationDidEnterBackground:, как вы делаете с sleep(), iOS просто прекратит работу вашего приложения, если тот не вернется из этого метода быстро.

Ваше приложение периодически просыпается, если оно сконфигурировано для фоновой обработки событий GPS, VOIP и т. Д., Но злоупотребление ими только для запуска приложения не позволит вам получить одобрение App Store.

Это все описано в Руководство по программированию приложений iOS .

0 голосов
/ 09 октября 2011

Для тех, кто ищет обходной путь, я просто создал систему, которая планирует таймеры на более позднюю дату, когда applicationDidEnterBackground:, и изменил / отменил их, когда они были отредактированы / удалены. Информация о расписании таймера была сохранена в местном словаре.

...