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