web-dev-qa-db-fra.com

Bloc d'achèvement personnalisé pour ma propre méthode

Je viens de découvrir des blocs d'achèvement:

 completion:^(BOOL finished){


                     }];

Que dois-je faire pour que ma propre méthode prenne un bloc d'achèvement?

76
user2206906

1) Définissez votre propre bloc d'achèvement,

typedef void(^myCompletion)(BOOL);

2) Créez une méthode qui prend votre bloc d'achèvement en tant que paramètre,

-(void) myMethod:(myCompletion) compblock{
    //do stuff
    compblock(YES);
}

) Voici comment vous l'utilisez,

[self myMethod:^(BOOL finished) {
    if(finished){
        NSLog(@"success");
    }
}];

enter image description here

Vous définissez le bloc en tant que type personnalisé:

typedef void (^ButtonCompletionBlock)(int buttonIndex);

Ensuite, utilisez-le comme argument d'une méthode:

+ (SomeButtonView*)buttonViewWithTitle:(NSString *)title 
                          cancelAction:(ButtonCompletionBlock)cancelBlock
                      completionAction:(ButtonCompletionBlock)completionBlock

En appelant ceci dans le code, c'est comme n'importe quel autre bloc:

[SomeButtonView buttonViewWithTitle:@"Title"
                       cancelAction:^(int buttonIndex) {
                             NSLog(@"User cancelled");
                   } 
                     completionAction:^(int buttonIndex) {
                             NSLog(@"User tapped index %i", buttonIndex);
                   }];

Si le moment est venu de déclencher le bloc, appelez simplement completionBlock() (où completionBlock est le nom de votre copie locale du bloc).

25
jszumski

La syntaxe des variables de bloc est similaire à celle des pointeurs de fonction en C.

Comme la syntaxe est laide, ils sont souvent typés, mais ils peuvent aussi être déclarés normalement.

typedef void (^MyFunc)(BOOL finished);

- (void)myMethod:(MyFunc)func
{
}

Voir cette réponse pour non typedef:

Déclarer un paramètre de méthode de bloc sans utiliser de typedef

2
Justin Meiners