it-swarm.com.de

Benutzerdefinierter Vervollständigungsblock für meine eigene Methode

Ich habe gerade Abschlussblöcke entdeckt:

 completion:^(BOOL finished){


                     }];

Was muss ich tun, damit meine eigene Methode einen Abschlussblock erstellt?

76
user2206906

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");
    }
}];

enter image description here

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).

25
jszumski

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

2
Justin Meiners