NSTimer
Вы используете 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
.
Оператор импорта
Swift
import Foundation
Objective C
@import Foundation;
Доступность
Доступный в OS X v10.0 и позже.
-
scheduledTimerWithTimeInterval (_: invocation:repeats:) + scheduledTimerWithTimeInterval:invocation:repeats:
Создает и возвращает новое
NSTimer
объект и расписания это на текущем цикле выполнения в режиме по умолчанию.Объявление
Swift
class func scheduledTimerWithTimeInterval(_
seconds
: NSTimeInterval, invocationinvocation
: NSInvocation, repeatsrepeats
: Bool) -> NSTimerObjective C
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)
seconds
invocation:(NSInvocation *)invocation
repeats:(BOOL)repeats
Параметры
seconds
Число секунд между взрывами таймера. Если
seconds
меньше чем или равно0.0
, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этого.invocation
Вызов для использования, когда стреляет таймер. Объект вызова поддерживает сильную ссылку к своим параметрам, пока таймер не лишен законной силы.
repeats
Если
YES
true
, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNO
false
, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Новое
NSTimer
объект, сконфигурированный согласно указанным параметрам.Обсуждение
После
seconds
секунды протекли, огни таймера, вызвавinvocation
.Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.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)
seconds
target:(id)target
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats
Параметры
seconds
Число секунд между взрывами таймера. Если
seconds
меньше чем или равно0.0
, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этого.target
Объект, в который можно отправить сообщение, указанное
aSelector
когда стреляет таймер. Таймер поддерживает сильную ссылку кtarget
до него (таймер) лишен законной силы.aSelector
Сообщение для отправки к
target
когда стреляет таймер.Селектор должен иметь следующую подпись:
timerFireMethod:
(включая двоеточие, чтобы указать, что метод берет параметр). Таймер передает себя как параметр, таким образом метод принял бы следующий образец:- (void)timerFireMethod:(NSTimer *)timer
userInfo
Пользовательская информация для таймера. Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы. Этот параметр может быть
nil
.repeats
Если
YES
true
, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNO
false
, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Новое
NSTimer
объект, сконфигурированный согласно указанным параметрам.Обсуждение
После
seconds
секунды протекли, огни таймера, отправив сообщениеaSelector
кtarget
.Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.0 и позже.
-
Создает и возвращает новое
NSTimer
объект инициализируется с указанным объектом вызова.Объявление
Swift
init(timeInterval
seconds
: NSTimeInterval, invocationinvocation
: NSInvocation, repeatsrepeats
: Bool) -> NSTimerObjective C
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)
seconds
invocation:(NSInvocation *)invocation
repeats:(BOOL)repeats
Параметры
seconds
Число секунд между взрывами таймера. Если
seconds
меньше чем или равно0.0
, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этогоinvocation
Вызов для использования, когда стреляет таймер. Таймер сообщает объекту вызова поддержать сильную ссылку к ее параметрам.
repeats
Если
YES
true
, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNO
false
, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Новое
NSTimer
объект, сконфигурированный согласно указанным параметрам.Обсуждение
Необходимо добавить новый таймер к циклу выполнения, с помощью
addTimer:forMode:
. Затем послеseconds
протекли, огни таймера, вызвавinvocation
. (Если таймер сконфигурирован для повторения, нет никакой потребности впоследствии повторно добавить таймер к циклу выполнения.)Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.0 и позже.
-
init (timeInterval:target:selector:userInfo:repeats:) + timerWithTimeInterval:target:selector:userInfo:repeats:
Создает и возвращает новое
NSTimer
объект, инициализированный с указанным объектом и селектором.Объявление
Swift
init(timeInterval
seconds
: NSTimeInterval, targettarget
: AnyObject, selectoraSelector
: Selector, userInfouserInfo
: AnyObject?, repeatsrepeats
: Bool) -> NSTimerObjective C
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)
seconds
target:(id)target
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats
Параметры
seconds
Число секунд между взрывами таймера. Если
seconds
меньше чем или равно0.0
, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этого.target
Объект, в который можно отправить сообщение, указанное
aSelector
когда стреляет таймер. Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы.aSelector
Сообщение для отправки к
target
когда стреляет таймер.Селектор должен иметь следующую подпись:
timerFireMethod:
(включая двоеточие, чтобы указать, что метод берет параметр). Таймер передает себя как параметр, таким образом метод принял бы следующий образец:- (void)timerFireMethod:(NSTimer *)timer
userInfo
Пользовательская пользовательская информация для таймера.
Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы. Этот параметр может быть
nil
.repeats
Если
YES
true
, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNO
false
, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Новое
NSTimer
объект, сконфигурированный согласно указанным параметрам.Обсуждение
Необходимо добавить новый таймер к циклу выполнения, с помощью
addTimer:forMode:
. Затем послеseconds
секунды протекли, огни таймера, отправив сообщениеaSelector
кtarget
. (Если таймер сконфигурирован для повторения, нет никакой потребности впоследствии повторно добавить таймер к циклу выполнения.)Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.0 и позже.
-
init (fireDate:interval:target:selector:userInfo:repeats:) - initWithFireDate:interval:target:selector:userInfo:repeats:
Определяемый инициализаторИнициализирует новое
NSTimer
объект с помощью указанного объекта и селектора.Объявление
Swift
init(fireDate
date
: NSDate, intervalseconds
: NSTimeInterval, targettarget
: AnyObject, selectoraSelector
: Selector, userInfouserInfo
: AnyObject?, repeatsrepeats
: Bool)Objective C
- (instancetype)initWithFireDate:(NSDate *)
date
interval:(NSTimeInterval)seconds
target:(id)target
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats
Параметры
date
Время, в которое должен сначала выстрелить таймер.
seconds
Для повторяющегося таймера этот параметр содержит число секунд между взрывами таймера. Если
seconds
меньше чем или равно0.0
, этот метод выбирает неотрицательное значение 0,1 миллисекунд вместо этого.target
Объект, в который можно отправить сообщение, указанное
aSelector
когда стреляет таймер. Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы.aSelector
Сообщение для отправки к
target
когда стреляет таймер.Селектор должен иметь следующую подпись:
timerFireMethod:
(включая двоеточие, чтобы указать, что метод берет параметр). Таймер передает себя как параметр, таким образом метод принял бы следующий образец:- (void)timerFireMethod:(NSTimer *)timer
userInfo
Пользовательская пользовательская информация для таймера. Таймер поддерживает сильную ссылку к этому объекту до него (таймер) лишен законной силы. Этот параметр может быть
nil
.repeats
Если
YES
true
, таймер будет неоднократно перепланировать себя, пока не лишено законной силы. ЕслиNO
false
, таймер будет лишен законной силы после того, как он будет стрелять.Возвращаемое значение
Получатель, инициализированный таким образом, что, когда добавлено к циклу выполнения, это выстрелит в
date
и затем, еслиrepeats
YES
true
, каждыйseconds
после этого.Обсуждение
Необходимо добавить новый таймер к циклу выполнения, с помощью
addTimer:forMode:
. После увольнения таймер отправляет сообщениеaSelector
кtarget
. (Если таймер сконфигурирован для повторения, нет никакой потребности впоследствии повторно добавить таймер к циклу выполнения.)Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.2 и позже.
-
Заставляет сообщение получателя быть отправленным в его цель.
Объявление
Swift
func fire()
Objective C
- (void)fire
Обсуждение
Можно использовать этот метод для увольнения повторяющегося таймера, не прерывая его регулярное расписание увольнения. Если таймер неповторяется, он автоматически лишен законной силы после увольнения, даже если не поступила его запланированная дата огня.
Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.0 и позже.
См. также
-
Останавливает получатель от когда-либо увольнения снова и запрашивает его удаление из его цикла выполнения.
Объявление
Swift
func invalidate()
Objective C
- (void)invalidate
Обсуждение
Этот метод является единственным способом удалить таймер из
NSRunLoop
объект.NSRunLoop
объект удаляет свою сильную ссылку к таймеру, любой как раз передinvalidate
метод возвращается или в некоторой более поздней точке.Если это было сконфигурировано с целью и пользовательскими информационными объектами, получатель удаляет свои сильные ссылки к тем объектам также.
Специальные замечания
Необходимо отправить это сообщение от потока, на котором был установлен таймер. При отправке этого сообщения от другого потока входной источник, связанный с таймером, не может быть удален из его цикла выполнения, который мог препятствовать тому, чтобы поток вышел должным образом.
Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.0 и позже.
См. также
-
допустимый допустимый
СвойствоБулево значение, указывающее, в настоящее время допустим ли получатель. (только для чтения)
Объявление
Swift
var valid: Bool { get }
Objective C
@property(readonly, getter=isValid) BOOL valid
Обсуждение
YES
true
если получатель все еще способен к увольнению илиNO
false
если таймер был лишен законной силы и больше не способен к увольнению.Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.10 и позже.
-
Дата, в которую выстрелит таймер.
Обсуждение
Если таймер больше не действителен, последняя дата, в которую выстрелил таймер.
Можно установить это свойство для корректировки времени увольнения повторяющегося таймера. Несмотря на то, что сброс следующего времени увольнения таймера является относительно дорогой работой, это может быть более эффективно в некоторых ситуациях. Например, Вы могли использовать его в ситуациях, где Вы хотите повторить действие многократно в будущем, но в неправильных временных интервалах. Корректировка времени увольнения единственного таймера, вероятно, подверглась бы меньшему количеству расхода, чем создание многократных объектов таймера, планирование каждого на цикле выполнения и затем уничтожении их.
Вы не должны изменять дату огня таймера, лишенного законной силы, который включает уже стрелявшие неповторяющиеся таймеры. Вы могли потенциально изменить дату огня неповторяющегося таймера, еще не стрелявшего, несмотря на то, что необходимо всегда делать так от потока, до которого таймер присоединен, избегают потенциальных условий состязания.
Используйте
isValid
метод, чтобы проверить, что таймер допустим.Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.0 и позже.
-
timeInterval timeInterval
СвойствоВременной интервал таймера. (только для чтения)
Объявление
Swift
var timeInterval: NSTimeInterval { get }
Objective C
@property(readonly) NSTimeInterval timeInterval
Обсуждение
Если получатель является неповторяющимся таймером, возвратами
0
даже если был установлен временной интервал.Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.0 и позже.
-
Получатель
userInfo
объект. (только для чтения)Объявление
Swift
var userInfo: AnyObject? { get }
Objective C
@property(readonly, retain) id userInfo
Обсуждение
Не получайте доступ к этому свойству после того, как таймер будет лишен законной силы. Использовать
isValid
протестировать, допустим ли таймер.Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.0 и позже.
-
Количество времени после запланированной даты огня, которую может запустить таймер.
Обсуждение
Значение по умолчанию является нулем, что означает, что не применяется никакой дополнительный допуск.
Установка допуска для таймера позволяет ему стрелять позже, чем запланированная дата огня. Разрешение войти системной гибкости, когда таймер стреляет, увеличивает возможность системы оптимизировать для увеличенной экономии электроэнергии и скорости отклика.
Таймер может стрелять в любое время между его запланированной датой огня и запланированной датой огня плюс допуск. Таймер не будет стрелять перед запланированной датой огня. Для повторения таймеров следующая дата огня вычисляется с исходной даты огня независимо от допуска, примененного в отдельные времена огня, для предотвращения смещения. Система сохраняет право применить мелкую сумму допуска к определенным таймерам независимо от значения этого свойства.
Оператор импорта
Objective C
@import Foundation;
Swift
import Foundation
Доступность
Доступный в OS X v10.9 и позже.