Obtenha o valor de retorno do alvo do NSTIMER
-
11-09-2019 - |
Pergunta
Eu tenho um NSTIMER que é configurado como este:
[NSTimer scheduledTimerWithTimeInterval:0.5 target:timerTarget selector:NSSelectorFromString(targetSelector) userInfo:nil repeats:YES];
Como posso obter o valor de retorno do timerTarget
método?
Solução
Você não pode, porque não há valor de retorno.
Quoth the Documentação do scheduledTimerWithTimeInterval:::::
método:
O seletor deve ter a seguinte assinatura:
- (void)timerFireMethod:(NSTimer*)theTimer
Agora você poderia Declare seu método de maneira diferente e, em seguida, retorne um valor nele, mas seu método tem uma assinatura diferente do que o NSTIMER espera. Isso funcionará bem agora, mas não é garantido que funcione no futuro - ele pode quebrar a qualquer momento, especialmente uma mudança no tempo de execução.
Além disso, como o NSTIMER não espera um valor de retorno, ele não tem disposições para receber um e passá -lo em qualquer lugar.
Além disso, como eu disse no meu comentário sobre a resposta de Adam, sua chamada para scheduledTimerWithTimeInterval:::::
Retorna apenas uma vez e (como Adam disse), o faz imediatamente. Você não recebe um valor de retorno a cada 0,5 segundos, porque não recebe um retorno a cada 0,5 segundos - você recebe um retorno só (por temporizador).
Qualquer que seja a informação que você esteja descobrindo no seu método do timer, você precisa agir sobre ela ou enviar uma mensagem com as informações de lá para outro método.
Outras dicas
O que você está fazendo com o valor de retorno? O alvo é executado de forma assíncrona 0,5 segundos depois. A chamada para scheduledTimerWithTimeInterval:target:selector:useInfo:repeats:
Retorna instantaneamente, momento em que o alvo não foi executado. Se você realmente precisa do valor de retorno agora mesmo, então não se preocupe com um cronômetro e apenas ligue para o seletor normalmente.
Seguindo a boa resposta de Adam, se você acha que precisa do valor de retorno do método direcionado após o término da execução, o que você provavelmente deseja fazer é ter o próprio método direcionado perpetuar alguma ação adicional.
Por exemplo, você pode usar o parâmetro "userInfo" para transmitir uma referência ao objeto interessado (self?). O método direcionado poderia então, em vez de retornar um valor, enviar o valor atualizado para si mesmo com um seletor pré-organizado. Por exemplo, em seu método de destino, você pode terminar com algo como:
[[theTimer userInfo] setWhatever:blah];
Conceitualmente, você precisa seguir o conselho de Adam e considerar o fato de que o método chamado pelo timer está acontecendo no futuro e se você deseja se conectar de volta a uma classe específica e seu fluxo de trabalho, precisa conectá -lo de alguma forma.