Получить возвращаемое значение цели NSTimer

У меня есть NSTimer, который настроен следующим образом:

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

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


person macinjosh    schedule 01.03.2009    source источник


Ответы (3)


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

Процитируйте документация метода scheduledTimerWithTimeInterval::::::

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

- (void)timerFireMethod:(NSTimer*)theTimer

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

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

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

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

person Peter Hosey    schedule 01.03.2009

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

person Adam Rosenfield    schedule 01.03.2009
comment
Мне нужно возвращаемое значение каждые 0,5 секунды. Цель отслеживает значение, которое часто меняется, и возвращает это значение, чтобы я мог видеть, действительно ли произошло изменение. - person macinjosh; 01.03.2009
comment
Затем вы должны действовать в соответствии с изменением метода таймера. Помните, запланированныйTimerWithTimeInterval::::: возвращает только один раз. Он не возвращается один раз для каждого вызова таймера. Вы вызываете scheduleTimer…::::: один раз, поэтому он возвращается один раз. - person Peter Hosey; 01.03.2009

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

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

[[theTimer userInfo] setWhatever:blah];

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

person danielpunkass    schedule 01.03.2009