Sök…
Syntax
Som en variabel:
returnType (^ blockName) (parameterTypes) = ^ returnType (parameters) {...};
Som en fastighet:
@property (nonatomic, copy) returnType (^ blockName) (parameterTypes);
Som metodparameter:
- (void) methodWithBlock: (returnType (^) (parameterTypes)) blockName;
Som typedef:
typedef returnType (^ TypeName) (parameterTypes);
Typnamn blockName = ^ returnType (parametrar) {...};
UIV-animationer
[UIView animateWithDuration:1.0
animations:^{
someView.alpha = 0;
otherView.alpha = 1;
}
completion:^(BOOL finished) {
[someView removeFromSuperview];
}];
Karat “^” -tecknet definierar ett block. Till exempel är ^{ … }
ett block. Mer specifikt är det ett block som returnerar "ogiltigt" och accepterar inga argument. Det motsvarar en metod som: "- (ogiltigt) något;" men det finns inget inneboende namn kopplat till kodblocket.
Definiera ett block som kan acceptera argument fungerar mycket på samma sätt. För att tillhandahålla ett argument till ett block definierar du blocket så: ^ (BOOL someArg, NSString someStr) {…} *. När du använder API-samtal som stöder block skriver du block som liknar det här, särskilt för animationsblock eller NSURLConnection-block som visas i exemplet ovan.
Anpassat kompletteringsblock för anpassade metoder
1- Definiera ditt eget anpassade block
typedef void(^myCustomCompletion)(BOOL);
2- Skapa anpassad metod som tar ditt anpassade kompletteringsblock som en parameter.
-(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- Hur man använder block i din metod
[self customMethodName:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Ändra fångad variabel
Block kommer att fånga variabler som visade sig i samma lexikala omfattning. Normalt fångas dessa variabler som "const" -värde:
int val = 10;
void (^blk)(void) = ^{
val = 20; // Error! val is a constant value and cannot be modified!
};
För att ändra variabeln måste du använda modifieraren __block lagringstyp.
__block int val = 10;
void (^blk)(void) = ^{
val = 20; // Correct! val now can be modified as an ordinary variable.
};