Пользовательский блок завершения для моего собственного метода [дубликат]


этот вопрос уже есть ответ здесь:

Я только что обнаружил блоки завершения:

 completion:^(BOOL finished){


                     }];

что мне нужно сделать, чтобы мой собственный метод взял блок завершения?

3 71

3 ответа:

1) Определите свой собственный блок завершения,

typedef void(^myCompletion)(BOOL);

2) создать метод, который принимает блок завершения в качестве параметра

-(void) myMethod:(myCompletion) compblock{
    //do stuff
    compblock(YES);
}

3) Вот как вы его используете,

[self myMethod:^(BOOL finished) {
    if(finished){
        NSLog(@"success");
    }
}];

enter image description here

вы определяете блок как пользовательский тип:

typedef void (^ButtonCompletionBlock)(int buttonIndex);

затем используйте его в качестве аргумента для метода:

+ (SomeButtonView*)buttonViewWithTitle:(NSString *)title 
                          cancelAction:(ButtonCompletionBlock)cancelBlock
                      completionAction:(ButtonCompletionBlock)completionBlock

при вызове этого кода он так же, как и любой другой блок:

[SomeButtonView buttonViewWithTitle:@"Title"
                       cancelAction:^(int buttonIndex) {
                             NSLog(@"User cancelled");
                   } 
                     completionAction:^(int buttonIndex) {
                             NSLog(@"User tapped index %i", buttonIndex);
                   }];

если приходит время, чтобы вызвать блок, просто позвоните completionBlock() (где completionBlock - имя вашей локальной копии блока).

блочные переменные похожи по синтаксису на указатели функций в C.

потому что синтаксис уродливый они часто typedefed, однако они также могут быть объявлены нормально.

typedef void (^MyFunc)(BOOL finished);

- (void)myMethod:(MyFunc)func
{
}

см. этот ответ для non typedef:

объявить параметр метода блока без использования typedef