Recherche…
Syntaxe
En tant que variable:
returnType (^ blockName) (parameterTypes) = ^ returnType (paramètres) {...};
En tant que propriété:
@property (nonatomique, copie) returnType (^ blockName) (parameterTypes);
En tant que paramètre de méthode:
- (void) methodWithBlock: (returnType (^) (parameterTypes)) blockName;
En typedef:
typedef returnType (^ TypeName) (parameterTypes);
TypeName blockName = ^ returnType (paramètres) {...};
Animations UIView
[UIView animateWithDuration:1.0
animations:^{
someView.alpha = 0;
otherView.alpha = 1;
}
completion:^(BOOL finished) {
[someView removeFromSuperview];
}];
Le carat «^» définit un bloc. Par exemple, ^{ … }
est un bloc. Plus précisément, il s'agit d'un bloc qui renvoie «void» et n'accepte aucun argument. Cela équivaut à une méthode telle que: "- (void) quelquechose", mais il n'y a pas de nom inhérent associé au bloc de code.
Définir un bloc pouvant accepter des arguments fonctionne de manière très similaire. Pour fournir un argument à un bloc, vous définissez le bloc comme suit : ^ (BOOL someArg, NSString someStr) {…} *. Lorsque vous utilisez des appels API prenant en charge des blocs, vous allez écrire des blocs qui ressemblent à cela, en particulier pour les blocs d'animation ou les blocs NSURLConnection, comme indiqué dans l'exemple ci-dessus.
Bloc d'achèvement personnalisé pour les méthodes personnalisées
1- Définir votre propre bloc personnalisé
typedef void(^myCustomCompletion)(BOOL);
2- Créez une méthode personnalisée qui prend en compte votre bloc d’achèvement personnalisé.
-(void) customMethodName:(myCustomCompletion) compblock{
//do stuff
// check if completion block exist; if we do not check it will throw an exception
if(complblock)
compblock(YES);
}
3- Comment utiliser block dans votre méthode
[self customMethodName:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Modifier la variable capturée
Block capturera les variables apparaissant dans la même portée lexicale. Normalement, ces variables sont capturées en tant que "const" valeur:
int val = 10;
void (^blk)(void) = ^{
val = 20; // Error! val is a constant value and cannot be modified!
};
Pour modifier la variable, vous devez utiliser le modificateur de type de stockage __block.
__block int val = 10;
void (^blk)(void) = ^{
val = 20; // Correct! val now can be modified as an ordinary variable.
};