Насколько я знаю, есть два различных этапа жизненного цикла приложения IOS, когда она скрыта:Почему NSTimer сохраняется, когда приложение приостановлено?
- Фона - когда мы все еще в состоянии продолжить вычисление и коды запуска;
- Suspended - когда любые вычисления заморожены, и мы ничего не можем сделать, пока пользователь не вернется в приложение.
Так я немного запутался о следующем примере:
- (void)applicationDidEnterBackground:(UIApplication *)application {
(void)(^expirationHandler)() = [^{
[application endBackgroundTask:bgTask];
self.bgTask = UIBackgroundTaskInvalid;
} copy];
self.bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:expirationHandler];
[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(count)
userInfo:nil
repeats:YES];
expirationHandler();
}
- (void)count {
int i = 0;
while (i < 10000000) {
i++;
}
NSLog(@"%d", i);
}
P.S. Я воспроизвел его из памяти, дайте мне знать, если что-то не так, но вопрос не связан с правильностью фрагмента.
Я тестировал его на iPhone 6+ с iOS 9.3, и указанный таймер продолжает стрельбу, кроме того, метод счета выполняет код (вы можете проверить его на значение i
). Правильно ли, что приложение должно перейти в приостановленное состояние после запланированного таймера? Если да, то почему count
способен выполнять код?
Заранее благодарен.
Можете ли вы показать нам объявление 'bgTask'? Это переменная экземпляра? Я пытаюсь исключить, что то, что вы фиксируете в блоке, является значением, а не ссылкой. – Tommy
Это образец ivar в примере, но я думаю, что вы получите тот же результат даже с локальной переменной '__block'. –
. Тестируете ли вы во время работы под отладчиком в Xcode? Если это так, то у приложения нет фоновых временных ограничений или не будет приостановлено. – Paulw11