Zoeken…
Syntaxis
Als een variabele:
returnType (^ blockName) (parameterTypes) = ^ returnType (parameters) {...};
Als een eigenschap:
@property (nonatomic, copy) returnType (^ blockName) (parameterTypes);
Als methode parameter:
- (void) methodWithBlock: (returnType (^) (parameterTypes)) blockName;
Als een typefef:
typedef returnType (^ TypeName) (parameterTypes);
TypeName blockName = ^ returnType (parameters) {...};
UIView animaties
[UIView animateWithDuration:1.0
animations:^{
someView.alpha = 0;
otherView.alpha = 1;
}
completion:^(BOOL finished) {
[someView removeFromSuperview];
}];
Het karaat '^' karakter definieert een blok. ^{ … }
is bijvoorbeeld een blok. Meer specifiek is het een blok dat "ongeldig" retourneert en geen argumenten accepteert. Het is gelijk aan een methode zoals: "- (nietig) iets;" maar er is geen inherente naam gekoppeld aan het codeblok.
Definieer een blok dat argumenten kan accepteren die op dezelfde manier werken. Om een argument aan een blok te geven, definieert u het blok als volgt: ^ (BOOL someArg, NSString someStr) {…} *. Wanneer u API-aanroepen gebruikt die blokken ondersteunen, schrijft u blokken die er ongeveer hetzelfde uitzien, vooral voor animatieblokken of NSURLConnection-blokken zoals in het bovenstaande voorbeeld.
Aangepast voltooiingsblok voor aangepaste methoden
1- Definieer uw eigen aangepaste blok
typedef void(^myCustomCompletion)(BOOL);
2- Maak een aangepaste methode die uw aangepaste voltooiingsblok als parameter neemt.
-(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- Hoe blok te gebruiken in uw methode
[self customMethodName:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Wijzig de vastgelegde variabele
Blok zal variabelen vastleggen die in hetzelfde lexicale bereik verschenen. Normaal worden deze variabelen vastgelegd als "const" -waarde:
int val = 10;
void (^blk)(void) = ^{
val = 20; // Error! val is a constant value and cannot be modified!
};
Om de variabele te wijzigen, moet u de __block opslagtype-modificator gebruiken.
__block int val = 10;
void (^blk)(void) = ^{
val = 20; // Correct! val now can be modified as an ordinary variable.
};