Реализация метода, принимающего блок для использования в качестве обратного вызова


Я хотел бы написать метод, подобный этому:

+(void)myMethodWithView:(UIView *)exampleView completion:(void (^)(BOOL finished))completion;

Я в основном урезал синтаксис, взятый из одного из методов класса Apple для UIView:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

и ожидал бы, что он будет использоваться так:

[myFoo myMethodWithView:self.view completion:^(BOOL finished){
                     NSLog(@"call back success");
                 }];

мой вопрос в том, как я могу это реализовать? Если кто-то может указать мне на правильную документацию, это было бы здорово, и очень простой пример был бы очень признателен (или аналогичный ответ на переполнение стека - я не мог найти одно.) Я все еще недостаточно знаю о делегатах, чтобы определить, является ли это даже правильным подходом!

я поставил грубый пример того, что я ожидал бы, что это будет в файле реализации, но поскольку я не могу найти информацию, это догадка.

+ (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
    // do stuff

    if (completion) {
        // what sort of syntax goes here? If I've constructed this correctly!
    }

}
3 69

3 ответа:

вы можете вызвать блок, как обычная функция:

BOOL finished = ...;
if (completion) {
    completion(finished);
}

таким образом, это означает, что реализация полной блочной функции с помощью вашего примера будет выглядеть следующим образом:

+ (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
    if (completion) {
        completion(finished);
    }
}

Я настоятельно рекомендую вам прочитать на блоки чтобы понять, что происходит.

Если вы специально ищете док, чтобы создать пользовательский метод с использованием блоков, то следующая ссылка, которая объясняет почти все. :)

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/bxUsing.html

Я недавно отвечал на один и тот же вопрос, взгляните на это: объявить параметр метода блока без использования typedef