Question

J'ai un nstimer qui est configuré comme ceci:

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

Comment puis-je obtenir la valeur de retour du timerTarget méthode?

Était-ce utile?

La solution

Vous ne pouvez pas, car il n'y a pas de valeur de retour.

En termes de documentation du scheduledTimerWithTimeInterval::::: méthode:

Le sélecteur doit avoir la signature suivante:

- (void)timerFireMethod:(NSTimer*)theTimer

Maintenant, c'est à votre tour pourrait Déclarez votre méthode différemment, puis renvoyez une valeur dedans, mais votre méthode a une signature différente de celle de NStimer. Cela fonctionnera bien maintenant, mais il n'est pas garanti de fonctionner à l'avenir - il pourrait se casser à tout moment, en particulier un changement dans l'exécution.

Plus précisément, puisque NStimer ne s'attend pas à une valeur de retour, elle n'a aucune disposition pour en recevoir une et la transmettre n'importe où.

De plus, comme je l'ai dit dans mon commentaire sur la réponse d'Adam, votre appel à scheduledTimerWithTimeInterval::::: ne revient qu'une seule fois, et (comme Adam l'a dit), il le fait immédiatement. Vous n'obtenez pas une valeur de retour toutes les 0,5 secondes, car vous n'obtenez pas un retour toutes les 0,5 secondes - vous obtenez un retour seulement (par minuterie).

Quelles que soient les informations que vous découvrez dans votre méthode Timer, vous devez soit y agir là-bas, soit envoyer un message avec les informations de là à une autre méthode.

Autres conseils

Que faites-vous avec la valeur de retour? La cible est exécutée de manière asynchrone 0,5 seconde plus tard. L'appel à scheduledTimerWithTimeInterval:target:selector:useInfo:repeats: Renvoie instantanément, à quel point la cible n'a pas été exécutée. Si vous avez vraiment besoin de la valeur de retour à l'heure actuelle, alors ne vous souciez pas d'une minuterie et appelez simplement le sélecteur normalement.

Suite à la bonne réponse d'Adam, si vous pensez que vous avez besoin de la valeur de retour de la méthode ciblée une fois qu'il a terminé la course, alors ce que vous voulez probablement faire est d'avoir la méthode ciblée elle-même perpétuer une action supplémentaire.

Par exemple, vous pouvez utiliser le paramètre "userInfo" pour transmettre une référence à l'objet intéressé (soi?). La méthode ciblée pourrait alors, au lieu de renvoyer une valeur, envoyer la valeur mise à jour à soi avec un sélecteur pré-arrangé. Par exemple, dans votre méthode cible, vous pouvez finir avec quelque chose comme:

[[theTimer userInfo] setWhatever:blah];

Conceptuellement, vous devez suivre les conseils d'Adam et considérer le fait que la méthode appelée par la minuterie se produit à l'avenir et si vous souhaitez vous connecter à une classe spécifique et à son flux de travail, vous devez le connecter vous-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top