#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, используемого в настоящее время на устройстве.