Интервал NSTimer меньше, чем команда sleep в запущенном коде - PullRequest
0 голосов
/ 03 февраля 2010

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

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

Что было бы идеально, так это сохранить функциональность остановки и запуска и запускать каждые 0,3 секунды, но при этом не нужно явно говорить, что я хочу, чтобы он срабатывал каждые x секунд. Значение 0.5 совершенно произвольно, и его значение> 0,3.

.

Если я установлю таймер на срабатывание каждые 0,01 секунды, но оставлю команду сна в коде на 0,3 секунды, получу ли я желаемое поведение? Или таймер поддержит все события с неожиданными результатами (например, несколько срабатываний после того, как я остановил его)? Таким образом, я мог бы сделать 0,3-секундный сон переменным, и мне не нужно менять таймер всякий раз, когда я увеличиваю его до 0,5.

Или есть лучший способ получить эту функциональность?

1 Ответ

1 голос
/ 03 февраля 2010

Одна из самых больших проблем, с которыми я сталкиваюсь, заключается в том, что NSTimer будет занимать время в любом потоке, в котором он зарегистрирован.

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

Несколько альтернативных дизайнов, которые могут быть лучше для вас.

  1. Не спи. Попросите селектор, вызванный таймером, выполнить проверку «Я остановился» и досрочно завершите работу, если это так.

  2. Недействительно NSTimer при паузе и воссоздайте его, когда он не используется (Примечание: вы не можете просто перенести старый таймер).

  3. Создать фоновый поток с его собственным RunLoop или даже вашим собственным циклом while, который просто обрабатывает перепланирование с помощью sleep.

Это также примерно в том порядке, в котором я их буду делать, поскольку № 1 кажется мне наиболее чистым, за ним следует № 2. № 3, в то время как жизнеспособный может привести к большой гадости (проблемы с потоками, чистые отключения и т. Д.)

...