Buscar..


Sintaxis

  • Como variable:

    returnType (^ blockName) (parametersTypes) = ^ returnType (parámetros) {...};

  • Como propiedad:

    @property (nonatomic, copy) returnType (^ blockName) (parametersTypes);

  • Como parámetro del método:

    - (void) methodWithBlock: (returnType (^) (parametersTypes)) blockName;

  • Como typedef:

    typedef returnType (^ TypeName) (parametersTypes);

    TypeName blockName = ^ returnType (parámetros) {...};

Animaciones UIView

[UIView animateWithDuration:1.0
    animations:^{
        someView.alpha = 0;
        otherView.alpha = 1;
    }
    completion:^(BOOL finished) {
    [someView removeFromSuperview];
}];

El carácter quilate "^" define un bloque. Por ejemplo, ^{ … } es un bloque. Más específicamente, es un bloque que devuelve "vacío" y no acepta argumentos. Es equivalente a un método como "- (anular) algo", pero no hay un nombre inherente asociado con el bloque de código.

Definir un bloque que pueda aceptar argumentos que funcionen de manera muy similar. Para proporcionar un argumento a un bloque, defina el bloque de la siguiente manera: ^ (BOOL someArg, NSString someStr) {…} *. Cuando use llamadas a la API que admiten bloques, escribirá bloques que se parecen a esto, especialmente para bloques de animación o bloques de conexión NSURLC, como se muestra en el ejemplo anterior.

Bloque de finalización personalizado para métodos personalizados

1- Define tu propio bloque personalizado

typedef void(^myCustomCompletion)(BOOL);

2- Crear un método personalizado que tome su bloque de finalización personalizado como un parámetro.

-(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- Cómo usar el bloque en tu método.

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

Modificar la variable capturada

El bloque capturará variables que aparecieron en el mismo ámbito léxico. Normalmente estas variables se capturan como valor "const":

int val = 10;
void (^blk)(void) = ^{
    val = 20; // Error! val is a constant value and cannot be modified!
};

Para modificar la variable, debe utilizar el modificador de tipo de almacenamiento __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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow