2011-02-09 10 views
18

После прочтения документации для NSRunLoop я не очень понял. Я создаю дополнительный поток, в котором есть NSTimer, который запускается каждые 1 сек. Какие обновления метки на экране с performSelectorOnMainThread ..Что такое runloop?

Однако, чтобы получить его на работу, мне нужна была runloop, но я не понимаю ее концепции?

Любой, кто мог бы попытаться объяснить это?

Спасибо.

ответ

27

Цикл запуска эффективно:

while(... get an event ...) 
    ... handle event ...; 

Она работает на потоке; основной поток имеет основной цикл событий, в котором обрабатываются пользовательские события, и большинство рисунков пользовательского интерфейса и т. д. documentation explains it in detail.

Однако, в вашем случае, вам не нужна нить.

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

Просто назначьте свой таймер в основной теме и сделайте с ним. Нет необходимости разворачивать поток, используя performSelectorOnMainThread: или нести всю сложность обеспечения согласованности данных по потокам.


Извините, не понял ваш вопрос.

Внутренний цикл запуска работает, в основном помещая флаг в цикл цикла, который говорит «после истечения этого количества времени, запустите таймер». Никаких дополнительных потоков не было, и, еще лучше, это не опрос, чтобы проверить время. Подумайте о запуске цикла, эффективно поддерживая график. Это будет пассивно, если время истечет, пока на шкале времени не появится что-то интересное (все без опроса - опрос.)

Это означает, что таймер никогда не будет на 100% точным , Кроме того, если у вас есть таймер, повторяющийся каждую секунду, он со временем будет дрейфовать.

Также; вместо прямого запуска события рисования. Ваш таймер должен аннулировать представление, которое нуждается в обновлении, а затем разрешить базовые объекты, когда лучше всего обновить экран.

+2

Таймер не будет на 100% точным, но со временем он не будет дрейфовать. В документе говорится: «Повторяющийся таймер автоматически перенастраивается на основе запланированного времени стрельбы, а не фактического времени стрельбы. Например, если таймер планируется запустить в определенное время и каждые 5 секунд после этого, запланированное время стрельбы всегда будет падать первоначальные 5-секундные интервалы времени, даже если фактическое время стрельбы задерживается. – CarmeloS

+0

Это новое поведение. Раньше они дрейфовали с течением времени. – bbum

+0

Я думаю, вам стоит поместить версию системы, из которой поведение изменилось здесь, чтобы другие, включая меня , можно правильно использовать таймеры. Не могли бы вы вспомнить? – CarmeloS

12

This page объясняет это довольно хорошо. FTA:

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

+0

@Rodrige, спасибо! Так что это по существу третий поток, который выполняет код, когда происходит событие? – LuckyLuke

+0

Нет, совсем нет. Описание выше является точным, но - нет - вам не нужен третий поток для обработки таймера второго потока для отправки событий в основной цикл событий. – bbum

+0

@bbum Нет, я знаю, что мне не нужно делать третье, но это третий поток, который работает за кулисами, вот что я имел в виду, это правильно? – LuckyLuke

Смежные вопросы