Вопросы о цели NSTimer и параметрах userInfo - PullRequest
4 голосов
/ 28 сентября 2011

Я прочитал SO, а также посмотрел документацию Apple по классу NSTimer, и кажется, что самый простой способ создать таймер - использовать следующий метод:

[NSTimer scheduledTimerWithTimeInterval:15.0
                                 target:self
                               selector:@selector(fireThisMethod:)
                               userInfo:nil
                                repeats:NO];

Iпонимать, что это создаст таймер, который срабатывает через 15 секунд.Метод, который будет запущен, будет любым методом, переданным в «селектор» (в данном случае «fireThisMethod»).Поскольку «повторяется» - «НЕТ», это означает, что он будет запущен только один раз.Мои вопросы:

1) Можно ли передать метод в «селектор», который имеет более одного параметра?Я видел методы без каких-либо параметров, или в данном случае 1 (так как после имени метода присутствует «:»).Такой метод, как fireThisMethod: anotherParameter:?

2) Я не уверен, правильно ли я понимаю, для чего предназначены параметры "target" и "userInfo".Будет ли у вас когда-нибудь «цель», которая не является «я»?Будет ли у вас «userInfo», который не ноль?Если да, то по каким сценариям?

Спасибо

1 Ответ

6 голосов
/ 28 сентября 2011

Вопрос 1

Нет.Взгляните на документы .Цитирование:

Селектор должен иметь следующую подпись:

- (void)timerFireMethod:(NSTimer*)theTimer

Селекторы для методов без аргументов неверны,Передаваемый аргумент - это таймер, поэтому вы можете различать, какой таймер сработал из вашего метода (если более одного таймера вызывает один и тот же метод).

Вопрос 2a

target может быть любым объектом, который реализует данный метод.Иногда вы можете захотеть, чтобы конкретный объект (кроме себя) выполнял задачу после срабатывания таймера.

Вопрос 2b

Это именно то, что вы ищете.userInfo может быть любым объектом, может быть контейнером данных, NSValue или любой другой вещью.Используйте это, чтобы передать дополнительную информацию вашему методу, который будет извлекать ее следующим образом:

- (void)timerFireMethod:(NSTimer*)theTimer
{
    id info = [theTimer userInfo]; /* give it an appropriate type */

    ...
}
...