2010-06-08 5 views
2

J'ai une classe "BSjax" que j'ai écrite qui me permet de faire des appels asynchrones à notre serveur pour obtenir des ensembles de résultats json, etc. en utilisant la classe ASIHTTPRequest. Je l'ai mis en place afin que la classe BSjax parse réponse JSON de mon serveur, puis passe le contrôle au contrôleur de vue de l'appel via cet appel:callbacks via des sélecteurs d'objectif-c

[[self delegate] performSelectorOnMainThread:@selector(bsRequestFinished:) withObject:self waitUntilDone:YES]; 

... où « bsRequestFinished » est la méthode de rappel dans la vue d'appel manette. Tout a bien fonctionné jusqu'à ce que je réalise que certaines pages vont devoir faire différents types de requêtes ... c'est-à-dire que je vais vouloir faire différents types de choses dans cette fonction de rappel en fonction du type de requête effectuée. Pour moi, il semble que le fait de pouvoir transmettre différents noms de fonctions de rappel à ma classe BSjax soit la solution la plus propre ... mais j'ai des problèmes (et je ne suis même pas sûr que cela soit possible) de transmettre une variable qui détient le nom de la fonction de rappel, puis remplacer l'appel ci-dessus avec quelque chose comme ceci:

[[self delegate] performSelectorOnMainThread:@selector(self.variableCallbackFunctionName) withObject:self waitUntilDone:YES]; 

... où « self.variableCallbackFunctionName » est réglé par le contrôleur de vue d'appel quand il appelle BSjax de faire une nouvelle demande.

Est-ce encore possible? Si oui, conseillé? Si non, des alternatives?

EDIT: Notez que le correctif auquel j'arrive doit prendre en compte la réalité que cette classe effectue des requêtes asynchrones ... donc je dois m'assurer que le traitement de la fonction de rappel est correctement lié aux requêtes spécifiques. .. comme je ne peux pas compter sur la séquence de traitement FIFO.

EDIT 2: Vous voulez passer une variable de type SEL? Ce à quoi je me bats maintenant, c'est de trouver la syntaxe pour l'enregistrer en tant que propriété conservée de la classe BSjax.

Répondre

2

Quel type de variable est variBkecallbackfunctionname? Un NSString? Dans ce cas, vous voudrez probablement quelque chose comme ceci:

[[self delegate] performSelectorOnMainThread:NSSelectorFromString(self.variableCallbackFunctionName) withObject:self waitUntilDone:YES]; 

Je suis à un iPad, je ne peux pas tester, mais lui donner un essai. Editer: et si variableCallbackFunctionName n'est pas un nsstring, le moyen le plus simple serait de le faire, si je comprends votre question.

Edit 2: docs pour qui sont à http://developer.apple.com/mac/library/iPad/index.html#documentation/cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html%23//apple_ref/c/func/NSSelectorFromString

+0

belle ... u l'homme! ne connaissait même pas cette fonction NSSelectorFromString. a parfaitement fonctionné! – codemonkey

3

Vous pouvez passer autour sélecteurs en tant que valeurs SEL. Par exemple:

SEL oneSelector = @selector(bsRequestFinished:); 
SEL anotherselector = @selector(somethingElse:); 
NSString *nameOfSelector = askUserForSelectorName(); 
SEL dynamicSelector = NSSelectorFromString(nameOfSelector); 

Il suffit donc de faire votre variableCallbackFunctionName un SEL et il est encore plus simple que vous espériez:

[[self delegate] performSelectorOnMainThread:self.variableCallbackFunctionName withObject:self waitUntilDone:YES];