Objective-C du gestionnaire de rappel
J'ai une méthode de rappel que j'ai eu à travailler, mais je veux savoir comment transmettre des valeurs.
Ce que j'ai est: est-ce
@interface DataAccessor : NSObject
{
void (^_completionHandler)(Account *someParameter);
}
- (void) signInAccount:(void(^)(Account *))handler;
Le code ci-dessus fonctionne, mais je veux passer des valeurs à la méthode. Comment serait-ce look? Quelque chose comme:
- (void) signInAccount:(void(^)(Account *))handler user:(NSString *) userName pass:(NSString *) passWord;
?
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas entièrement sûr de ce que vous essayez de le faire là - bas- votre fonction de rappel est un bloc... est-ce intentionnel? Je m'attends à ce que votre méthode ressembler à quelque chose comme ceci:
Si l'intention de votre rappel est d'exécuter un code supplémentaire (spécifié lors de l'appel de la méthode), sur la fin, puis un bloc serait utile. Par exemple, votre méthode pourrait ressembler à ceci:
Puis appelez la méthode comme suit:
L'appel de cette méthode permettrait de connecter l'utilisateur dans le compte, puis dès que c'est terminé, montrer l'équilibre. C'est clairement un exemple artificiel, mais j'espère que vous obtenez l'idée.
Si ce n'est pas le genre de chose que vous avez voulu, alors il suffit d'utiliser une méthode de signature comme celle ci-dessus.
MODIFIER (UN meilleur exemple d'utilisation de la
successful
variable):Une meilleure conception serait de passer un Booléen de retour à la fin du bloc qui décrit la façon dont la connexion a:
Vous verrez aussi que cette fois-ci, nous sommes en vérifiant que la
completionBlock
paramètre n'est pasnil
avant de l'appeler - c'est important si vous souhaitez autoriser le recours à la méthode sans un achèvement bloc. Vous pouvez utiliser cette méthode comme suit:Mieux encore (si vous pouvez excuse les andains d'exemples!), si il serait utile pour l'utilisateur de connaître la raison de l'échec, de retour d'un
NSError
objet:L'appelant peut alors faire usage de la
NSError
dans la réalisation et à déterminer la façon de procéder (le plus probable, pour décrire à l'utilisateur ce qui n'allait pas). Ce type de modèle est légèrement moins fréquente (bien que parfaitement valide); la plupart desNSError
s sont retournés par le pointeur d'adressage indirect, par exemple dans leNSFileWrapper
s-initWithURL:options:error:
méthode:Dans le login exemple, cependant, nous sommes probablement attendre la tentative de connexion à prendre une certaine quantité de temps pour le terminer (par exemple en vous connectant à un compte en ligne), de sorte qu'il est parfaitement raisonnable d'utiliser un gestionnaire d'achèvement qui passe à une erreur.
BOOL
, ou, éventuellement, de passer dans unNSError
objet par pointeur-indirection pour déterminer la façon dont le signe en est allé.if (successful)
partie est sur? Comment puis-je définirsuccessful
? Je suppose que c'est unBOOL
?successful
est juste une hypothèse de variable locale qui est retourné à décrire que la connexion a fonctionné ou pas. Une meilleure solution pourrait être de retour que Booléenne dans la réalisation du bloc. J'ai ajouté une modification de la réponse qui illustre cela.