Цикл запуска эффективно:
while(... get an event ...)
... handle event ...;
Она работает на потоке; основной поток имеет основной цикл событий, в котором обрабатываются пользовательские события, и большинство рисунков пользовательского интерфейса и т. д. documentation explains it in detail.
Однако, в вашем случае, вам не нужна нить.
Похоже, что все, что вы делаете, периодически обновляет ярлык в пользовательском интерфейсе; то, что не очень интенсивно вычислить.
Просто назначьте свой таймер в основной теме и сделайте с ним. Нет необходимости разворачивать поток, используя performSelectorOnMainThread:
или нести всю сложность обеспечения согласованности данных по потокам.
Извините, не понял ваш вопрос.
Внутренний цикл запуска работает, в основном помещая флаг в цикл цикла, который говорит «после истечения этого количества времени, запустите таймер». Никаких дополнительных потоков не было, и, еще лучше, это не опрос, чтобы проверить время. Подумайте о запуске цикла, эффективно поддерживая график. Это будет пассивно, если время истечет, пока на шкале времени не появится что-то интересное (все без опроса - опрос.)
Это означает, что таймер никогда не будет на 100% точным , Кроме того, если у вас есть таймер, повторяющийся каждую секунду, он со временем будет дрейфовать.
Также; вместо прямого запуска события рисования. Ваш таймер должен аннулировать представление, которое нуждается в обновлении, а затем разрешить базовые объекты, когда лучше всего обновить экран.
Таймер не будет на 100% точным, но со временем он не будет дрейфовать. В документе говорится: «Повторяющийся таймер автоматически перенастраивается на основе запланированного времени стрельбы, а не фактического времени стрельбы. Например, если таймер планируется запустить в определенное время и каждые 5 секунд после этого, запланированное время стрельбы всегда будет падать первоначальные 5-секундные интервалы времени, даже если фактическое время стрельбы задерживается. – CarmeloS
Это новое поведение. Раньше они дрейфовали с течением времени. – bbum
Я думаю, вам стоит поместить версию системы, из которой поведение изменилось здесь, чтобы другие, включая меня , можно правильно использовать таймеры. Не могли бы вы вспомнить? – CarmeloS