Получить возвращаемое значение цели NSTimer - PullRequest
1 голос
/ 01 марта 2009

У меня есть NSTimer, который настроен так:

[NSTimer scheduledTimerWithTimeInterval:0.5 target:timerTarget selector:NSSelectorFromString(targetSelector) userInfo:nil repeats:YES];

Как я могу получить возвращаемое значение метода timerTarget?

Ответы [ 3 ]

5 голосов
/ 01 марта 2009

Вы не можете, потому что нет возвращаемого значения.

Quoth документация метода scheduledTimerWithTimeInterval::::: :

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

- (void)timerFireMethod:(NSTimer*)theTimer

Теперь вы могли бы объявить свой метод по-другому и затем вернуть в него значение, но тогда ваш метод имеет другую сигнатуру, чем ожидает NSTimer. Это будет хорошо работать сейчас, но не гарантируется, что оно будет работать в будущем - оно может сломаться в любое время, особенно при изменении времени выполнения.

Более конкретно, поскольку NSTimer не ожидает возвращаемого значения, у него нет условий для его получения и передачи в любом месте.

Более того, как я сказал в своем комментарии к ответу Адама, ваш звонок на scheduledTimerWithTimeInterval::::: возвращается только один раз, и (как сказал Адам) он делает это немедленно. Вы не получаете одно возвращаемое значение каждые 0,5 секунды, потому что вы не получаете одно возвращение каждые 0,5 секунды - вы получаете одно возвращение только (за таймер).

Какую бы информацию вы не обнаружили в методе таймера, вам нужно либо действовать там, либо отправлять сообщение с информацией оттуда другому методу.

5 голосов
/ 01 марта 2009

Что вы делаете с возвращаемым значением? Цель запускается асинхронно через 0,5 секунды. Вызов scheduledTimerWithTimeInterval:target:selector:useInfo:repeats: мгновенно возвращается, и в этот момент цель не была выполнена. Если вам действительно нужно возвращаемое значение прямо сейчас , не беспокойтесь о таймере и просто вызовите селектор в обычном режиме.

1 голос
/ 01 марта 2009

Следуя хорошему ответу Адама, если вам кажется, что вам нужно возвращаемое значение целевого метода после его завершения, то вам, вероятно, нужно сделать так, чтобы сам целевой метод увековечил некоторые дальнейшие действия.

Например, вы можете использовать параметр userInfo для передачи ссылки на заинтересованный объект (self?). Затем целевой метод, вместо возврата значения, может отправить обновленное значение себе с помощью заранее организованного селектора. Например, в вашем целевом методе вы можете закончить что-то вроде:

[[theTimer userInfo] setWhatever:blah];

Концептуально вам нужно принять совет Адама и учесть тот факт, что метод, вызываемый таймером, происходит в будущем, и если вы хотите подключиться к определенному классу и его рабочему процессу, вам нужно как-то подключить его самостоятельно .

...