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?
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");
}
}];
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).
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