Странный результат попытки запустить NSTimer после перехода приложения в фоновый режим

#iphone #nstimer #background-process

#iPhone #время ожидания #фоновый процесс

Вопрос:

Это мой код:

 - (void) printCount {
    NSLog(@"Current second: %i", i  );
}


- (void)applicationDidEnterBackground:(UIApplication *)application
{    
    UIBackgroundTaskIdentifier taskId = [application beginBackgroundTaskWithExpirationHandler:^{NSLog(@"Task expired");}];
    [NSTimer scheduledTimerWithTimeInterval:1.0
                                     target:self
                                   selector:@selector(printCount) userInfo:nil repeats:YES];
    if (i == 10000) {
        [application endBackgroundTask:taskId];
    }
}
 

И это журнал, который я получаю:

 ....
Current second: 579
Current second: 580
Current second: 581
Current second: 582
Current second: 583
Task expired
Current second: 584
Current second: 585
Current second: 586
Current second: 587
Current second: 588
Current second: 589
Current second: 590
....
 

Насколько я знаю, использование beginBackgroundTaskWithExpirationHandler разрешено только на 10 минут. Я имею в виду, что это UIBackgroundTaskIdentifier должно «истечь» через 10 минут. И это действительно произошло («Срок действия задачи истек» в журнале)! Но зачем NSTimer продолжать бежать? о_О
С уважением!

Комментарии:

1. На самом деле это именно то, что я хотел. Этот NSTimer будет продолжать работать даже через 10 минут. 🙂 Но почему это происходит?

Ответ №1:

Из документации для beginBackgroundTaskWithExpirationHandler :

Обработчик, который должен быть вызван незадолго до того, как оставшееся фоновое время приложения достигнет 0. Вы должны использовать этот обработчик для очистки и отметить окончание фоновой задачи. Неспособность завершить задачу явно приведет к завершению работы приложения. Обработчик вызывается синхронно в основном потоке, тем самым блокируя приостановку приложения на мгновение, пока приложение получает уведомление.

Т.е. это просто уведомление о том, что срок действия задачи истекает, вы по-прежнему несете ответственность за закрытие задачи (и если вы этого не сделаете, то система просто убьет ее через некоторое время).

Комментарии:

1. «.. убить через некоторое время». .. Примерно, сколько времени это может занять?

2. Это недокументировано, и я ожидаю, что оно варьируется от выпуска ОС к выпуску ОС и зависит от объема памяти / etc, используемого в настоящее время на устройстве.