Цикл выполнения приложения замедляется при приеме/инициировании сотового вызова

У меня есть таймер, который запускает метод через каждые 60 мс интервала, когда приложение находится на переднем плане, и срабатывает с тем же интервалом, даже если оно находится в фоновом режиме.

Когда я инициирую/принимаю мобильный вызов, таймер запускает метод через каждые 120 мс интервала. Я подумал, что это проблема с таймером, поэтому я попробовал следующие подходы.

Подходы, которые я пробовал:

  1. NSTimer в фоновом потоке.
  2. NSTimer в основном потоке.
  3. dispatch_source_timer
  4. цикл while с 60 мс сна. (Здесь нет таймера)

Таким образом, даже если вы используете простой цикл while, все равно есть задержка при запуске метода. Поэтому, чтобы сохранить интервал, я изменил интервал таймера на 30 мс (для всех подходов), когда я получаю/инициирую вызов, но результат тот же (120 мс).

Буду рад, если кто подскажет подход.


person PKN    schedule 21.09.2015    source источник
comment
С какой стати вам нужен таймер, который срабатывает каждые 60 мс в фоновом режиме? Вот в этом, видимо, и суть проблемы...   -  person Airsource Ltd    schedule 21.09.2015
comment
Чувак, я не могу тебе объяснить, почему я хочу, чтобы таймер срабатывал здесь каждые 60 мс. Если у вас есть какой-либо подход к запуску метода каждые 60 мс независимо от состояния приложения, пожалуйста, ответьте.   -  person PKN    schedule 21.09.2015
comment
Как ты спишь? NSThread sleepFor... или usleep?   -  person Airsource Ltd    schedule 22.09.2015
comment
Что произойдет, если вы вообще не спите (в фоновом потоке)? Ваша обработка все равно будет прервана в конце концов, вы возобновите ее в течение необходимых 60 мс? Если нет, вы будете бороться - если вы это сделаете, то отправной точкой для запуска каждые 60 мс будет вообще не спать, и это очень полезная точка данных.   -  person Airsource Ltd    schedule 22.09.2015
comment
Я использовал NSThread sleepForTimeInterval для сна   -  person PKN    schedule 22.09.2015


Ответы (1)


Из документа Apple:

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

Что вы должны помнить о таймере, так это то, что когда вы устанавливаете его на время T, вы можете быть уверены, что время, прошедшее между двумя тиками, составляет не менее T.

person Thomas Ayoub    schedule 21.09.2015
comment
Спасибо за быстрый ответ. Как я уже упоминал, он запускает метод каждые 120 мс, даже если вы используете простой цикл while, который вызывает назначенный метод каждые 60 мс. Так что это не имеет ничего общего с таймером, так как он замедляет цикл выполнения приложения, когда вы разговариваете по сотовому телефону. - person PKN; 21.09.2015
comment
Я предполагаю, что в этом простом цикле while вы используете [NSThread sleepForTimeInterval:T]? Этот метод гарантирует спящий режим только в течение минимум временного интервала T. Короче говоря, в многозадачной системе нет реального способа гарантировать, что вы спите в течение только временного интервала T, только для того, чтобы убедиться, что вы спите в течение минимум временного интервала T. Это связано с тем, что любая другая задача может быть запланирована, пока вы спите, и системе может потребоваться больше времени, чем T, чтобы вернуться к вашей задаче. - person jbg; 02.01.2016