Suche…
Syntax
Als Variable:
returnType (^ blockName) (parameterTypes) = ^ returnType (parameter) {...};
Als Eigenschaft:
@ property (nonatomic, copy) returnType (^ blockName) (parameterTypes);
Als Methodenparameter:
- (void) methodWithBlock: (returnType (^) (parameterTypes)) blockName;
Als typedef:
typedef returnType (^ TypeName) (parameterTypes);
Typname blockName = ^ returnType (Parameter) {...};
UIView Animationen
[UIView animateWithDuration:1.0
animations:^{
someView.alpha = 0;
otherView.alpha = 1;
}
completion:^(BOOL finished) {
[someView removeFromSuperview];
}];
Das Carat-Zeichen "^" definiert einen Block. Zum Beispiel ist ^{ … }
ein Block. Genauer gesagt, ist dies ein Block, der "void" zurückgibt und keine Argumente akzeptiert. Es ist äquivalent zu einer Methode wie: "- (void) etwas;", aber dem Codeblock ist kein inhärenter Name zugeordnet.
Definieren Sie einen Block, der Argumente akzeptieren kann, die sehr ähnlich funktionieren. Um einem Block ein Argument zu geben, definieren Sie den Block folgendermaßen: ^ (BOOL someArg, NSString someStr) {…} *. Wenn Sie API-Aufrufe verwenden, die Blöcke unterstützen, schreiben Sie Blöcke, die ähnlich aussehen, insbesondere für Animationsblöcke oder NSURLConnection-Blöcke, wie im obigen Beispiel gezeigt.
Benutzerdefinierter Abschlussblock für benutzerdefinierte Methoden
1- Definieren Sie Ihren eigenen benutzerdefinierten Block
typedef void(^myCustomCompletion)(BOOL);
2- Erstellen Sie eine benutzerdefinierte Methode, die Ihren benutzerdefinierten Abschlussblock als Parameter verwendet.
-(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- Verwendung des Blocks in Ihrer Methode
[self customMethodName:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Erfasste Variable ändern
Block erfasst Variablen, die im gleichen lexikalischen Bereich angezeigt wurden. Normalerweise werden diese Variablen als "const" -Wert erfasst:
int val = 10;
void (^blk)(void) = ^{
val = 20; // Error! val is a constant value and cannot be modified!
};
Um die Variable zu ändern, müssen Sie den Modifizierer __block storage type verwenden.
__block int val = 10;
void (^blk)(void) = ^{
val = 20; // Correct! val now can be modified as an ordinary variable.
};