Реализация метода, принимающего блок для использования в качестве обратного вызова - PullRequest
69 голосов
/ 24 августа 2011

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

+(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 ]

84 голосов
/ 24 августа 2011

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

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

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

+ (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
    if (completion) {
        completion(finished);
    }
}
5 голосов
/ 24 августа 2011

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

1 голос
/ 24 августа 2011

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

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

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

...