2016-06-16 3 views
1

Насколько я знаю, есть два различных этапа жизненного цикла приложения 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 способен выполнять код?

Заранее благодарен.

+0

Можете ли вы показать нам объявление 'bgTask'? Это переменная экземпляра? Я пытаюсь исключить, что то, что вы фиксируете в блоке, является значением, а не ссылкой. – Tommy

+0

Это образец ivar в примере, но я думаю, что вы получите тот же результат даже с локальной переменной '__block'. –

+3

. Тестируете ли вы во время работы под отладчиком в Xcode? Если это так, то у приложения нет фоновых временных ограничений или не будет приостановлено. – Paulw11

ответ

0

Согласно @Paulw11 в комментариях,

Вы тестирование во время работы под отладчиком в Xcode? Если это так, то у приложения нет фоновых временных ограничений или не будет приостановлено.

Я не нашел никаких доказательств, но с помощью эмпирического исследования это кажется правдой.

Смежные вопросы