NSTimer
Оператор импорта
Swift
import Foundation
Objective C
@import Foundation;
Доступность
Доступный в iOS 2.0 и позже.
Вы используете NSTimer класс для создания объектов таймера или, проще, таймеры. Таймер ожидает, пока определенный временной интервал не протек и затем стреляет, отправляя указанное сообщение в целевой объект. Например, Вы могли создать NSTimer объект, отправляющий сообщение в окно, говоря ему обновить себя после определенного временного интервала.
Таймеры работают в сочетании с выполненными циклами. Для использования таймера эффективно необходимо знать, как выполненные циклы работают — посмотрите NSRunLoop и Поточная обработка Руководства по программированию. Отметьте в частности, что выполненные циклы поддерживают сильные ссылки к своим таймерам, таким образом, Вы не должны поддерживать свою собственную сильную ссылку к таймеру после добавления его к циклу выполнения.
Таймер не является механизмом в реальном времени; это стреляет только, когда один из режимов цикла выполнения, к которым был добавлен таймер, работает и способный проверить, передало ли время увольнения таймера. Из-за различных входных источников управляет типичный цикл выполнения, эффективное разрешение временного интервала для таймера ограничивается на порядке 50-100 миллисекунд. Если время увольнения таймера происходит во время длинной выноски или в то время как цикл выполнения находится в режиме, не контролирующем таймер, таймер не стреляет до следующего раза цикл выполнения проверяет таймер. Поэтому фактическое время, в которое огни таймера потенциально могут быть значительным промежутком времени после запланированного времени увольнения. См. также Допуск Таймера.
NSTimer “бесплатный соединенный мостом” с его Базовым дубликатом Основы, CFRunLoopTimerRef. Посмотрите Бесплатное Образование моста для получения дополнительной информации о бесплатном образовании моста.
Повторение по сравнению с неповторяющимися таймерами
Вы указываете, повторяется ли таймер или неповторяется во время создания. Неповторяющийся таймер стреляет один раз и затем лишает законной силы себя автоматически, таким образом препятствуя тому, чтобы таймер стрелял снова. В отличие от этого, повторяющийся таймер запускает и затем перепланирует себя на том же цикле выполнения.
Повторяющийся таймер всегда планирует себя на основе запланированного времени увольнения, в противоположность фактическому времени увольнения. Например, если таймер, как будут планировать, будет стрелять в определенное время и каждые 5 секунд после этого, то запланированное время увольнения будет всегда падать на исходные 5 интервалы второго раза, даже если будет задержано фактическое время увольнения. Если время увольнения задерживается до сих пор, что оно передает один или больше запланированных времен увольнения, таймер уволен только один раз за тот период времени; таймер тогда перепланируется, после увольнения, в следующий запланированный раз увольнения в будущем.
Допуск таймера
В iOS 7 и позже и OS X v10.9 и позже, можно указать допуск для таймера (tolerance). Разрешение войти системной гибкости, когда таймер огни улучшает возможность системы оптимизировать для увеличенной экономии электроэнергии и скорости отклика. Таймер может стрелять в любое время между его запланированной датой огня и запланированной датой огня плюс допуск. Таймер не будет стрелять перед запланированной датой огня. Для повторения таймеров следующая дата огня вычисляется с исходной даты огня независимо от допуска, примененного в отдельные времена огня, для предотвращения смещения. Значение по умолчанию является нулем, что означает, что не применяется никакой дополнительный допуск. Система сохраняет право применить мелкую сумму допуска к определенным таймерам независимо от значения свойства допуска.
Как пользователь таймера, у Вас будет лучшая идея того, каков надлежащий допуск для таймера может быть. Общее правило ползунка, тем не менее, состоит в том, чтобы установить допуск по крайней мере в 10% интервала для повторяющегося таймера. Даже мелкая сумма допуска окажет значительное позитивное влияние на использование питания Вашего приложения. Система может поместить максимальное значение допуска.
Планирование таймеров в выполненных циклах
Объект таймера может быть зарегистрирован только в одном выполненном цикле за один раз, несмотря на то, что это может быть добавлено к многократным режимам цикла выполнения в том цикле выполнения. Существует три способа создать таймер:
Используйте
scheduledTimerWithTimeInterval:invocation:repeats:илиscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:метод класса создать таймер и запланировать его на текущий цикл выполнения в режиме по умолчанию.Используйте
timerWithTimeInterval:invocation:repeats:илиtimerWithTimeInterval:target:selector:userInfo:repeats:метод класса создать таймер возражает, не планируя его на цикл выполнения. (После того, как, создавая его, необходимо добавить таймер к циклу выполнения вручную путем вызоваaddTimer:forMode:метод соответствияNSRunLoopобъект.)Выделите таймер и инициализируйте его с помощью
initWithFireDate:interval:target:selector:userInfo:repeats:метод. (После того, как, создавая его, необходимо добавить таймер к циклу выполнения вручную путем вызоваaddTimer:forMode:метод соответствияNSRunLoopобъект.)
После того, как запланированный на цикл выполнения, таймер стреляет в указанный интервал, пока это не лишено законной силы. Неповторяющийся таймер сразу лишает законной силы себя после того, как он будет стрелять. Однако для повторяющегося таймера, необходимо лишить законной силы объект таймера сами путем вызова invalidate метод. Вызов этого метода запрашивает демонтаж таймера от текущего цикла выполнения; в результате необходимо всегда вызывать invalidate метод от того же потока, на котором был установлен таймер. Лишение законной силы таймера сразу отключает его так, чтобы это больше не влияло на цикл выполнения. Цикл выполнения тогда демонтирует таймер (и сильная ссылка, которую это имело к таймеру), любой как раз перед invalidate метод возвращается или в некоторой более поздней точке. После того, как лишенный законной силы, объекты таймера не могут быть снова использованы.
Разделение на подклассы примечаний
Вы не должны пытаться разделить на подклассы NSTimer.
-
scheduledTimerWithTimeInterval (_: invocation:repeats:) + scheduledTimerWithTimeInterval:invocation:repeats:Создает и возвращает новое
NSTimerобъект и расписания это на текущем цикле выполнения в режиме по умолчанию.Объявление
Swift
class func scheduledTimerWithTimeInterval(_seconds: NSTimeInterval, invocationinvocation: NSInvocation, repeatsrepeats: Bool) -> NSTimerObjective C
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)secondsinvocation:(NSInvocation *)invocationrepeats:(BOOL)repeatsПараметры
secondsЧисло секунд между взрывами таймера. Если
secondsменьше чем или равно0.0, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этого.invocationВызов для использования, когда стреляет таймер. Объект вызова поддерживает сильную ссылку к своим параметрам, пока таймер не лишен законной силы.
repeatsЕсли
YEStrue, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNOfalse, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Новое
NSTimerобъект, сконфигурированный согласно указанным параметрам.Обсуждение
После
secondsсекунды протекли, огни таймера, вызвавinvocation.Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
-
scheduledTimerWithTimeInterval (_: target:selector:userInfo:repeats:) + scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:Создает и возвращает новое
NSTimerобъект и расписания это на текущем цикле выполнения в режиме по умолчанию.Объявление
Swift
class func scheduledTimerWithTimeInterval(_seconds: NSTimeInterval, targettarget: AnyObject, selectoraSelector: Selector, userInfouserInfo: AnyObject?, repeatsrepeats: Bool) -> NSTimerObjective C
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)secondstarget:(id)targetselector:(SEL)aSelectoruserInfo:(id)userInforepeats:(BOOL)repeatsПараметры
secondsЧисло секунд между взрывами таймера. Если
secondsменьше чем или равно0.0, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этого.targetОбъект, в который можно отправить сообщение, указанное
aSelectorкогда стреляет таймер. Таймер поддерживает сильную ссылку кtargetдо него (таймер) лишен законной силы.aSelectorСообщение для отправки к
targetкогда стреляет таймер.Селектор должен иметь следующую подпись:
timerFireMethod:(включая двоеточие, чтобы указать, что метод берет параметр). Таймер передает себя как параметр, таким образом метод принял бы следующий образец:- (void)timerFireMethod:(NSTimer *)timer
userInfoПользовательская информация для таймера. Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы. Этот параметр может быть
nil.repeatsЕсли
YEStrue, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNOfalse, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Новое
NSTimerобъект, сконфигурированный согласно указанным параметрам.Обсуждение
После
secondsсекунды протекли, огни таймера, отправив сообщениеaSelectorкtarget.Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
-
Создает и возвращает новое
NSTimerобъект инициализируется с указанным объектом вызова.Объявление
Swift
init(timeIntervalseconds: NSTimeInterval, invocationinvocation: NSInvocation, repeatsrepeats: Bool) -> NSTimerObjective C
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)secondsinvocation:(NSInvocation *)invocationrepeats:(BOOL)repeatsПараметры
secondsЧисло секунд между взрывами таймера. Если
secondsменьше чем или равно0.0, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этогоinvocationВызов для использования, когда стреляет таймер. Таймер сообщает объекту вызова поддержать сильную ссылку к ее параметрам.
repeatsЕсли
YEStrue, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNOfalse, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Новое
NSTimerобъект, сконфигурированный согласно указанным параметрам.Обсуждение
Необходимо добавить новый таймер к циклу выполнения, с помощью
addTimer:forMode:. Затем послеsecondsпротекли, огни таймера, вызвавinvocation. (Если таймер сконфигурирован для повторения, нет никакой потребности впоследствии повторно добавить таймер к циклу выполнения.)Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
-
init (timeInterval:target:selector:userInfo:repeats:) + timerWithTimeInterval:target:selector:userInfo:repeats:Создает и возвращает новое
NSTimerобъект, инициализированный с указанным объектом и селектором.Объявление
Swift
init(timeIntervalseconds: NSTimeInterval, targettarget: AnyObject, selectoraSelector: Selector, userInfouserInfo: AnyObject?, repeatsrepeats: Bool) -> NSTimerObjective C
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)secondstarget:(id)targetselector:(SEL)aSelectoruserInfo:(id)userInforepeats:(BOOL)repeatsПараметры
secondsЧисло секунд между взрывами таймера. Если
secondsменьше чем или равно0.0, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этого.targetОбъект, в который можно отправить сообщение, указанное
aSelectorкогда стреляет таймер. Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы.aSelectorСообщение для отправки к
targetкогда стреляет таймер.Селектор должен иметь следующую подпись:
timerFireMethod:(включая двоеточие, чтобы указать, что метод берет параметр). Таймер передает себя как параметр, таким образом метод принял бы следующий образец:- (void)timerFireMethod:(NSTimer *)timer
userInfoПользовательская пользовательская информация для таймера.
Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы. Этот параметр может быть
nil.repeatsЕсли
YEStrue, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNOfalse, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Новое
NSTimerобъект, сконфигурированный согласно указанным параметрам.Обсуждение
Необходимо добавить новый таймер к циклу выполнения, с помощью
addTimer:forMode:. Затем послеsecondsсекунды протекли, огни таймера, отправив сообщениеaSelectorкtarget. (Если таймер сконфигурирован для повторения, нет никакой потребности впоследствии повторно добавить таймер к циклу выполнения.)Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
-
init (fireDate:interval:target:selector:userInfo:repeats:) - initWithFireDate:interval:target:selector:userInfo:repeats:Определяемый инициализаторИнициализирует новое
NSTimerобъект с помощью указанного объекта и селектора.Объявление
Swift
init(fireDatedate: NSDate, intervalseconds: NSTimeInterval, targettarget: AnyObject, selectoraSelector: Selector, userInfouserInfo: AnyObject?, repeatsrepeats: Bool)Objective C
- (instancetype)initWithFireDate:(NSDate *)dateinterval:(NSTimeInterval)secondstarget:(id)targetselector:(SEL)aSelectoruserInfo:(id)userInforepeats:(BOOL)repeatsПараметры
dateВремя, в которое должен сначала выстрелить таймер.
secondsДля повторяющегося таймера этот параметр содержит число секунд между взрывами таймера. Если
secondsменьше чем или равно0.0, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этого.targetОбъект, в который можно отправить сообщение, указанное
aSelectorкогда стреляет таймер. Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы.aSelectorСообщение для отправки к
targetкогда стреляет таймер.Селектор должен иметь следующую подпись:
timerFireMethod:(включая двоеточие, чтобы указать, что метод берет параметр). Таймер передает себя как параметр, таким образом метод принял бы следующий образец:- (void)timerFireMethod:(NSTimer *)timer
userInfoПользовательская пользовательская информация для таймера. Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы. Этот параметр может быть
nil.repeatsЕсли
YEStrue, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNOfalse, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Получатель, инициализированный таким образом, что, когда добавлено к циклу выполнения, это выстрелит в
dateи затем, еслиrepeatsYEStrue, каждыйsecondsпосле этого.Обсуждение
Необходимо добавить новый таймер к циклу выполнения, с помощью
addTimer:forMode:. После увольнения таймер отправляет сообщениеaSelectorкtarget. (Если таймер сконфигурирован для повторения, нет никакой потребности впоследствии повторно добавить таймер к циклу выполнения.)Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
-
Заставляет сообщение получателя быть отправленным в его цель.
Объявление
Swift
func fire()Objective C
- (void)fireОбсуждение
Можно использовать этот метод для увольнения повторяющегося таймера, не прерывая его регулярное расписание увольнения. Если таймер неповторяется, он автоматически лишен законной силы после увольнения, даже если не поступила его запланированная дата огня.
Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
См. также
-
Останавливает получатель от когда-либо увольнения снова и запрашивает его удаление из его цикла выполнения.
Объявление
Swift
func invalidate()Objective C
- (void)invalidateОбсуждение
Этот метод является единственным способом удалить таймер из
NSRunLoopобъект.NSRunLoopобъект удаляет свою сильную ссылку к таймеру, любой как раз передinvalidateметод возвращается или в некоторой более поздней точке.Если это было сконфигурировано с целью и пользовательскими информационными объектами, получатель удаляет свои сильные ссылки к тем объектам также.
Специальные замечания
Необходимо отправить это сообщение от потока, на котором был установлен таймер. При отправке этого сообщения от другого потока входной источник, связанный с таймером, не может быть удален из его цикла выполнения, который мог препятствовать тому, чтобы поток вышел должным образом.
Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
См. также
-
validСвойствоБулево значение, указывающее, в настоящее время допустим ли получатель. (только для чтения)
Объявление
Swift
var valid: Bool { get }Objective C
@property(readonly, getter=isValid) BOOL validОбсуждение
YEStrueесли получатель все еще способен к увольнению илиNOfalseесли таймер был лишен законной силы и больше не способен к увольнению.Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 8.0 и позже.
-
fireDateСвойствоДата, в которую выстрелит таймер.
Обсуждение
Если таймер больше не действителен, последняя дата, в которую выстрелил таймер.
Можно установить это свойство для корректировки времени увольнения повторяющегося таймера. Несмотря на то, что сброс следующего времени увольнения таймера является относительно дорогой работой, это может быть более эффективно в некоторых ситуациях. Например, Вы могли использовать его в ситуациях, где Вы хотите повторить действие многократно в будущем, но в неправильных временных интервалах. Корректировка времени увольнения единственного таймера, вероятно, подверглась бы меньшему количеству расхода, чем создание многократных объектов таймера, планирование каждого на цикле выполнения и затем уничтожении их.
Вы не должны изменять дату огня таймера, лишенного законной силы, который включает уже стрелявшие неповторяющиеся таймеры. Вы могли потенциально изменить дату огня неповторяющегося таймера, еще не стрелявшего, несмотря на то, что необходимо всегда делать так от потока, до которого таймер присоединен, избегают потенциальных условий состязания.
Используйте
isValidметод, чтобы проверить, что таймер допустим.Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
-
timeIntervalСвойствоВременной интервал таймера. (только для чтения)
Объявление
Swift
var timeInterval: NSTimeInterval { get }Objective C
@property(readonly) NSTimeInterval timeIntervalОбсуждение
Если получатель является неповторяющимся таймером, возвратами
0даже если был установлен временной интервал.Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
-
userInfoСвойствоПолучатель
userInfoобъект. (только для чтения)Объявление
Swift
var userInfo: AnyObject? { get }Objective C
@property(readonly, retain) id userInfoОбсуждение
Не получайте доступ к этому свойству после того, как таймер будет лишен законной силы. Использовать
isValidпротестировать, допустим ли таймер.Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 2.0 и позже.
-
toleranceСвойствоКоличество времени после запланированной даты огня, которую может запустить таймер.
Обсуждение
Значение по умолчанию является нулем, что означает, что не применяется никакой дополнительный допуск.
Установка допуска для таймера позволяет ему стрелять позже, чем запланированная дата огня. Разрешение войти системной гибкости, когда таймер стреляет, увеличивает возможность системы оптимизировать для увеличенной экономии электроэнергии и скорости отклика.
Таймер может стрелять в любое время между его запланированной датой огня и запланированной датой огня плюс допуск. Таймер не будет стрелять перед запланированной датой огня. Для повторения таймеров следующая дата огня вычисляется с исходной даты огня независимо от допуска, примененного в отдельные времена огня, для предотвращения смещения. Система сохраняет право применить мелкую сумму допуска к определенным таймерам независимо от значения этого свойства.
Оператор импорта
Objective C
@import Foundation;Swift
import FoundationДоступность
Доступный в iOS 7.0 и позже.
