iOS bloc avec la valeur de retour
Je suis à l'aide d'un bloc de Facebook SDK. Il retourne un dictionnaire. Je veux que le dictionnaire en tant que valeur de retour d'une méthode. Je suis d'essayer d'envelopper ma tête autour de l'ensemble du bloc de concept, mais besoin d'un coup de pouce dans la bonne direction.
Le bloc:
(l'argument du bloc est une chaîne userFBid)
-(NSDictionary*) getMutualFBFriendsWithFBid:(NSString*)fbID {
[FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"/%@/mutualfriends/%@", [[PFUser currentUser] objectForKey:kFbID],userFBid]
parameters:nil
HTTPMethod:@"GET"
completionHandler:^(
FBRequestConnection *connection,
id result,
NSError *error
) {
result = (NSDictionary*)result;
//return result;
}];
}
Comment puis-je obtenir la valeur de retour?
J'ai essayé de chercher sur google, mais je ne peux pas obtenir ma main autour d'elle.
J'apprécierais toute pointeur dans la bonne direction.
EDIT:
La question principale est la suivante: j'ai besoin de le gestionnaire d'achèvement pour appeler une méthode d'une autre classe... comment faire?
- Les demandes sont faites asynchrone, donc vous devriez processus de "résultats" du dictionnaire de bloc ou de créer une méthode supplémentaire et de l'appeler avec la dictionnaire comme un argument.
- Je suis en utilisant le même "résultat" dans des classes différentes, donc je préfère être en mesure à l'appeler et utiliser le résultat de ces différentes classes. Essaye de comprendre comment.
- Vous pouvez stocker le
result
dans votre variable d'instance publique, et de l'accès au sein de votre d'autres classes. Est-ce que vous visez? - yup quelque chose comme ça oui. Voir modifier ci-dessus. Je dois mettre cette méthode dans une classe Singleton et utiliser le résultat dans une autre classe. Donc, vous êtes en quelque chose, juste à essayer de comprendre comment le faire. Je ne peux pas imaginer, je viens d'attribuer une propriété publique de la classe Singleton et d'obtenir que chaque fois que j'en ai besoin, puis le bloc va être appelé?
- Je ne comprends pas: pourquoi voulez-vous voulez l'appeler
completionHandler
's block ailleurs? - je suis à l'aide de cette méthode au dans une classe Singleton afin d'éviter une réécriture dans de nombreuses autres classes. J'ai donc dans un seul endroit. Donc, exemple, dans les deux autres classes, j'ai besoin de la le résultat de cette même méthode, et utiliser le résultat différemment. Donc quand il se termine, je peux mettre à jour l'INTERFACE utilisateur dans les autres classes. Suis-je en approchant de la mauvaise façon?
- Ok, voir mon édité répondre
- c'est exactement ce que je cherchais. Je viens également édité à ma question, et vous avez répondu 🙂 Maintenant, je vais essayer de la mettre en œuvre, qui fait beaucoup plus de sens. Merci!
Vous devez vous connecter pour publier un commentaire.
Que la méthode
startWithGraphPath
est asynchrone, vous ne pouvez pas le code comme si c'était synchrone : cela signifie pas de valeur de retour, parce que dès que cette méthode est appelée, votre application va continuer à exécuter à la ligne suivante, et n'auront pas à attendre pour une valeur de retour.Afin de conserver cette async, je suppose que vous voulez utiliser le résultat de cette dans votre propre fonction, afin de l'appeler dans votre
completionHandler
bloc:Modifier
OK, je l'obtiens. Modifier votre méthode d'accepter une fonction de rappel qu'un paramètre :
Puis, dans l'autre classe, utiliser un autre bloc pour traiter votre résultat :
Remarque : vous devez traiter l'erreur avant le déclenchement de votre rappel.
Edit 2 (Aider d'autres utilisateurs les ont apprécié
Encore mieux, vous pouvez essayez de passer un rappel en prenant tous les paramètres (pas testé, et pas sûr de la syntaxe. Si quelqu'un peut me corriger, je vous en serais reconnaissant):
Voici une référence sur l'Apple docs pour une meilleure compréhension.
callback(FBRequestConnection *connection,id result,NSError *error)
Vous l'avez déjà 🙂
Je voudrais écrire une méthode pour traiter le dictionnaire, afin de garder la completionHandler bloc un peu plus propre, mais vous pouvez écrire votre réponse-le code de gestion à l'intérieur du bloc. Comme un autre intervenant a mentionné, c'est asynchrone, donc vous n'êtes pas vraiment "le retour" à quoi que ce soit...vous êtes la manipulation de l'achèvement du bloc où elle est appelée.
Pour vous aider à comprendre un peu, le completionHandler bloc dans ce cas est un morceau de code que tu es de passage à la méthode comme un argument, pour l'appeler plus tard. En substance, "chaque fois que cet appel est de retour, faites ceci: ^{ ". La mise en œuvre de la FBRequest méthode appelle votre completionHandler (quel qu'il soit).