Используя NSInvocation
Создание NSInvocation
объект требует нескольких шагов. Рассмотрите этот метод пользовательского класса MyCalendar
:
– (BOOL)updateAppointmentsForDate:(NSDate *)aDate |
updateAppointmentsForDate:
берет NSDate
возразите как его единственный параметр и возвраты YES
или NO
в зависимости от того, могли ли бы назначения быть обновлены без конфликтов. Контролирование фрагмента кода устанавливает NSInvocation
объект для него:
SEL theSelector; |
NSMethodSignature *aSignature; |
NSInvocation *anInvocation; |
theSelector = @selector(updateAppointmentsForDate:); |
aSignature = [MyCalendar instanceMethodSignatureForSelector:theSelector]; |
anInvocation = [NSInvocation invocationWithMethodSignature:aSignature]; |
[anInvocation setSelector:theSelector]; |
Первые две строки добираются NSMethodSignature
объект для updateAppointmentsForDate:
метод. Последние две строки фактически создают NSInvocation
объект и набор его селектор. Обратите внимание на то, что селектор может быть установлен в любой селектор, соответствующий подпись updateAppointmentsForDate:
. Любой из этих методов может использоваться с anInvocation:
– (BOOL)clearAppointmentsForDate:(NSDate *)aDate |
– (BOOL)isAvailableOnDate:(NSDate *)aDate |
– (BOOL)setMeetingTime:(NSDate *)aDate |
Прежде чем быть диспетчеризированным anInvocation должен иметь свою цель и набор параметров:
MyCalendar *userDatebook; /* Assume this exists. */ |
NSDate *todaysDate; /* Assume this exists. */ |
[anInvocation setTarget:userDatebook]; |
[anInvocation setArgument:&todaysDate atIndex:2]; |
setArgument:atIndex:
устанавливает указанный параметр предоставленному значению. Каждый метод имеет два скрытых параметра, цель и селектор (чьи индексы 0
и 1
), таким образом, первый параметр, который должен быть установлен, фактически в индексе 2
. В этом случае todaysDate NSDate
параметр updateAppointmentsForDate:
.
Диспетчеризировать NSInvocation
возразите, отправьте invoke
или invokeWithTarget:
сообщение. invoke
только приводит к результату если NSInvocation
объект имеет целевой набор. После того, как диспетчеризированный, NSInvocation
объект содержит возвращаемое значение сообщения, который getReturnValue:
производит:
BOOL result; |
[anInvocation invoke]; |
[anInvocation getReturnValue:&result]; |
NSInvocation
не поддерживает вызовы методов или с переменными числами параметров или с union
параметры.
Сохранение объектов NSInvocation для более позднего использования
Поскольку NSInvocation
объект должен не всегда сохранять свои параметры, по умолчанию он не делает так. Это может заставить объектные параметры, а также цель становиться недопустимыми, если они автоматически выпущены. Если Вы планируете кэшироваться NSInvocation
объект или отгрузка это неоднократно во время выполнения Вашего приложения, необходимо отправить ему a retainArguments
сообщение. Этот метод сохраняет цель и все объектные параметры, и копирует струны до так, чтобы они не были потеряны, потому что другой объект освобождает их.
Используя объекты NSInvocation с таймерами
Предположим NSInvocation
объект, создаваемый выше, используется в приложении управления временем, позволяющем многочисленным пользователям устанавливать назначения для других, таких как встречи группы. Это приложение могло бы позволить календарю пользователя быть автоматически обновленным каждые несколько минут, так, чтобы пользователь всегда знал то, на что похоже его расписание. Такое автоматическое обновление может быть выполнено путем установки NSTimer
объекты с NSInvocation
объекты.
Данный NSInvocation
объект выше, это столь же просто как вызов одного метода NSTimer:
[NSTimer scheduledTimerWithInterval:600 |
invocation:anInvocation |
repeats:YES]; |
Эта строка кодовых наборов NSTimer
возразите для диспетчеризации anInvocation каждые 10 минут (600 секунд). Обратите внимание на то, что NSTimer
объект всегда сообщает NSInvocation
объект сохранить его параметры; таким образом Вы не должны отправлять retainArguments
самостоятельно. Посмотрите, что Таймер Программирует Темы для получения дополнительной информации о таймерах.