70 votes

Implémentation d'une méthode prenant un bloc à utiliser comme rappel

Je voudrais écrire une méthode similaire à ceci:

+(void)myMethodWithView:(UIView *)exampleView completion:(void (^)(BOOL finished))completion;

J'ai fait dépouillé la syntaxe prises à partir de l'une des Apple des méthodes de la classe pour UIView:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

Et s'attend à être utilisé comme suit:

[myFoo myMethodWithView:self.view completion:^(BOOL finished){
                     NSLog(@"call back success");
                 }];

Ma question est comment puis-je mettre en œuvre? Si quelqu'un peut me pointer à la documentation correcte, ce serait génial, et un exemple de base serait très apprécié (ou une réponse sur un Débordement de Pile -- je ne pouvais pas en trouver un). Je n'ai toujours pas en savoir assez sur les délégués pour déterminer si c'est même la bonne approche!

J'ai mis un exemple grossier de ce que j'aurais attendu qu'elle soit dans la mise en œuvre de fichier, mais comme je ne peux pas trouver d'info c'est du domaine de la conjecture.

+ (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
    // do stuff

    if (completion) {
        // what sort of syntax goes here? If I've constructed this correctly!
    }

}

84voto

omz Points 38947

Vous pouvez appeler un bloc comme une fonction normale:

 BOOL finished = ...;
if (completion) {
    completion(finished);
}
 

Cela signifie donc qu’implémenter une fonction de bloc complète en utilisant votre exemple ressemblerait à ceci:

 + (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
    if (completion) {
        completion(finished);
    }
}
 

5voto

Chaitanya Gupta Points 2696

Je vous recommande vivement de lire sur Blocks pour comprendre ce qui se passe.

1voto

Si vous êtes spécialement la recherche d'une doc, pour créer de la méthode personnalisée à l'aide de blocs, puis le lien ci-dessous est celui qui explique presque tout sur elle. :)

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/bxUsing.html

Il m'arrive de répondre tout à fait à une même question récemment, ont un oeil à ceci: objective-c: déclarer un bloc de paramètre de méthode sans utiliser un typedef?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X