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.
};


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow