Интервал NSTimer меньше, чем команда сна в запущенном коде

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

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

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

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

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


person Ben Packard    schedule 03.02.2010    source источник


Ответы (1)


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

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

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

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

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

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

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

person Bryan McLemore    schedule 03.02.2010
comment
Спасибо Брайан. № 2. это то, что я делаю в настоящее время. Но использование NSTimer означает, что у меня ДОЛЖЕН быть интервал, и этот интервал не может быть меньше, чем сон в селекторе. Не уверен, что понимаю номер 1. Сон должен позволить завершить что-то непрограммное, о чем я не могу знать, когда это будет сделано, так что это исключает это? Интересует нет. 3. Таким образом, вместо таймера я мог бы просто поддерживать бесконечный цикл, который проверяет логическое значение при входе, и чтобы «приостановить» цикл, я просто переключаю это логическое значение? И чтобы начать снова, мне нужно было бы вернуть bool обратно и снова запустить цикл? - person Ben Packard; 03.02.2010