Ich habe gerade Abschlussblöcke entdeckt:
completion:^(BOOL finished){
}];
Was muss ich tun, damit meine eigene Methode einen Abschlussblock erstellt?
1) Definieren Sie Ihren eigenen Abschlussblock,
typedef void(^myCompletion)(BOOL);
2) Erstellen Sie eine Methode, die Ihren Abschlussblock als Parameter verwendet.
-(void) myMethod:(myCompletion) compblock{
//do stuff
compblock(YES);
}
) So benutzt man es,
[self myMethod:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Sie definieren den Block als benutzerdefinierten Typ:
typedef void (^ButtonCompletionBlock)(int buttonIndex);
Verwenden Sie es dann als Argument für eine Methode:
+ (SomeButtonView*)buttonViewWithTitle:(NSString *)title
cancelAction:(ButtonCompletionBlock)cancelBlock
completionAction:(ButtonCompletionBlock)completionBlock
Wenn Sie dies im Code aufrufen, verhält es sich wie bei jedem anderen Block:
[SomeButtonView buttonViewWithTitle:@"Title"
cancelAction:^(int buttonIndex) {
NSLog(@"User cancelled");
}
completionAction:^(int buttonIndex) {
NSLog(@"User tapped index %i", buttonIndex);
}];
Wenn es Zeit ist, den Block auszulösen, rufen Sie einfach completionBlock()
auf (wobei completionBlock
der Name Ihrer lokalen Kopie des Blocks ist).
Blockvariablen haben eine ähnliche Syntax wie Funktionszeiger in C.
Da die Syntax hässlich ist, werden sie häufig typisiert, können jedoch auch normal deklariert werden.
typedef void (^MyFunc)(BOOL finished);
- (void)myMethod:(MyFunc)func
{
}
Siehe diese Antwort für nicht typedef:
Deklarieren Sie einen Blockmethodenparameter ohne Verwendung eines typedef