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

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

 completion:^(BOOL finished){


                     }];

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

Ответ 1

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

Ответ 2

Вы определяете блок как настраиваемый тип:

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 - имя вашей локальной копии блока).

Ответ 3

Блочные переменные аналогичны в синтаксисе указателям на функции в C.

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

typedef void (^MyFunc)(BOOL finished);

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

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

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