web-dev-qa-db-fra.com

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

Je voudrais écrire une méthode similaire à celle-ci:

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

J'ai essentiellement supprimé la syntaxe tirée de l'une des méthodes de classe d'Apple pour UIView:

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

Et s'attendrait à ce qu'il soit utilisé comme ceci:

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

Ma question est de savoir comment puis-je implémenter cela? Si quelqu'un peut m'indiquer la bonne documentation, ce serait génial, et un exemple très basique serait très apprécié (ou une réponse similaire sur Stack Overflow - je n'ai pas pu en trouver). Je ne connais pas encore assez les délégués pour déterminer si c'est même la bonne approche!

J'ai mis un exemple approximatif de ce que je m'attendais à ce que ce soit dans le fichier d'implémentation, mais comme je ne peux pas trouver d'informations, c'est une supposition.

+ (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!
    }

}
69
Chris

Vous pouvez appeler un bloc comme une fonction régulière:

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

Cela signifie donc que l'implémentation d'une fonction de bloc complète à l'aide de votre exemple ressemblerait à ceci:

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

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

5
Chaitanya Gupta

Si vous recherchez spécialement un document, pour créer une méthode personnalisée à l'aide de blocs, le lien suivant est celui qui explique presque tout à ce sujet. :)

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

Il se trouve que je réponds à une même question récemment, jetez un œil à ceci: Déclarez un paramètre de méthode de bloc sans utiliser de typedef

1