Таймеры
Таймеры работают в сочетании с NSRunLoop
объекты. В результате они не обеспечивают механизм в реальном времени — их точность ограничивается. Если Вы просто хотите отправить сообщение в некоторый момент в будущем, можно сделать так, не используя таймер.
Таймеры и выполненные циклы
Таймеры представлены NSTimer
объекты. Они работают в сочетании с NSRunLoop
объекты. NSRunLoop
объекты управляют циклами, ожидающими ввода, и они используют таймеры, чтобы помочь определить максимальную сумму времени, они должны ожидать. Когда ограничение по времени таймера протекло, цикл выполнения запускает таймер (то, чтобы заставлять его сообщение быть отправленным), затем проверяет на новый ввод.
Режим цикла выполнения, в котором Вы регистрируете таймер, должен работать за таймером для увольнения. Для приложений созданное использование Набора Приложения или UIKit, объект приложения выполняет цикл выполнения основного потока для Вас. На вторичных потоках, однако, необходимо работать, цикл выполнения сами — посмотрите Циклы Выполнения для подробных данных.
Каждый таймер цикла выполнения может быть зарегистрирован только в одном выполненном цикле за один раз, несмотря на то, что это может быть добавлено к многократным режимам цикла выполнения в том цикле выполнения.
Синхронизация точности
Таймер не является механизмом в реальном времени; это стреляет только, когда один из режимов цикла выполнения, к которым был добавлен таймер, работает и способный проверить, передало ли время увольнения таймера. Из-за различных входных источников управляет типичный цикл выполнения, эффективное разрешение временного интервала для таймера ограничивается на порядке 50-100 миллисекунд. Если время увольнения таймера происходит, в то время как цикл выполнения находится в режиме, не контролирующем таймер или во время длинной выноски, таймер не стреляет до следующего раза цикл выполнения проверяет таймер. Поэтому фактическое время, в которое огни таймера потенциально могут быть значительным промежутком времени после запланированного времени увольнения.
Повторяющийся таймер перепланирует себя на основе запланированного времени увольнения, не фактического времени увольнения. Например, если таймер, как будут планировать, будет стрелять в определенное время и каждые 5 секунд после этого, то запланированное время увольнения будет всегда падать на исходные 5 интервалы второго раза, даже если будет задержано фактическое время увольнения. Если время увольнения задерживается до сих пор, что оно передает один или больше запланированных времен увольнения, таймер уволен только один раз за тот период времени; таймер тогда перепланируется, после увольнения, в следующий запланированный раз увольнения в будущем.
Альтернативы таймерам
Если Вы просто хотите отправить сообщение в некоторый момент в будущем, можно сделать так, не используя таймер. Можно использовать performSelector:withObject:afterDelay:
и связанные методы для вызова метода непосредственно на другой объект. Некоторые варианты, такой как performSelectorOnMainThread:withObject:waitUntilDone:
, позвольте Вам вызывать метод на определенный поток. Можно также отменить задержанное сообщение, отправляют использование cancelPreviousPerformRequestsWithTarget:
и связанные методы.