Реализация метода, принимающего блок для использования в качестве обратного вызова
Я хотел бы написать метод, подобный этому:
+(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 ответа:
вы можете вызвать блок, как обычная функция:
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