Ответ 1
Эффект цикла запуска:
while(... get an event ...)
... handle event ...;
Он работает в потоке; основной поток имеет основной цикл событий, в котором обрабатываются пользовательские события, и большинство рисунков пользовательского интерфейса и т.д. Документация подробно объясняет это.
Однако в вашем случае вам не нужен поток.
Похоже, что все, что вы делаете, периодически обновляет ярлык в пользовательском интерфейсе; то, что не очень интенсивно вычисляется.
Просто планируйте свой таймер в основном потоке и выполняйте его. Нет необходимости в создании потока, используя performSelectorOnMainThread:
, или нести все сложности обеспечения согласованности данных по потокам.
Извините - не понял ваш вопрос.
Внутри, цикл запуска работает, в основном помещая флаг в цикл цикла, который говорит "после истечения этого количества времени, запускайте таймер". Никаких дополнительных потоков не было, и, еще лучше, это не опрос, чтобы проверить время. Подумайте о запуске цикла, эффективно поддерживая график. Это будет пассивно, если время истечет, пока на шкале времени не появится что-то интересное (все без опроса - опрос сосет. Этого следует избегать.)
Это означает, что таймер никогда не будет на 100% точным. Кроме того, если у вас есть таймер, повторяющийся каждую секунду, он со временем будет дрейфовать.
Также; вместо прямого запуска события рисования. Ваш таймер должен аннулировать представление, которое нуждается в обновлении, а затем разрешить базовые объекты, когда лучше всего обновить экран.