Ricerca…
Sintassi
Come variabile:
returnType (^ blockName) (parameterTypes) = ^ returnType (parametri) {...};
Come una proprietà:
@property (nonatomic, copy) returnType (^ blockName) (parameterTypes);
Come parametro del metodo:
- (void) methodWithBlock: (returnType (^) (parameterTypes)) blockName;
Come typedef:
typedef returnType (^ TypeName) (parameterTypes);
TypeName blockName = ^ returnType (parameters) {...};
Animazioni UIView
[UIView animateWithDuration:1.0
animations:^{
someView.alpha = 0;
otherView.alpha = 1;
}
completion:^(BOOL finished) {
[someView removeFromSuperview];
}];
Il carattere carato "^" definisce un blocco. Ad esempio, ^{ … }
è un blocco. Più specificamente, è un blocco che restituisce "void" e non accetta argomenti. È equivalente a un metodo come: "- (void) something;" ma non esiste un nome intrinseco associato al blocco di codice.
Definire un blocco che possa accettare argomenti funziona in modo molto simile. Per fornire un argomento a un blocco, si definisce il blocco in questo modo: ^ (BOOL someArg, NSString someStr) {...} *. Quando si utilizzano chiamate API che supportano i blocchi, si scriveranno blocchi simili a questo, in particolare per i blocchi di animazione o i blocchi NSURLConnection, come mostrato nell'esempio precedente.
Blocco di completamento personalizzato per metodi personalizzati
1- Definisci il tuo blocco personalizzato
typedef void(^myCustomCompletion)(BOOL);
2- Creare un metodo personalizzato che accetta il blocco di completamento personalizzato come parametro.
-(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- Come utilizzare il blocco nel metodo
[self customMethodName:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Modifica la variabile catturata
Il blocco catturerà le variabili che sono apparse nello stesso ambito lessicale. Normalmente queste variabili sono catturate come valore "const":
int val = 10;
void (^blk)(void) = ^{
val = 20; // Error! val is a constant value and cannot be modified!
};
Per modificare la variabile, è necessario utilizzare il modificatore del tipo di memoria __block.
__block int val = 10;
void (^blk)(void) = ^{
val = 20; // Correct! val now can be modified as an ordinary variable.
};