Я только что открыл блоки завершения:
completion:^(BOOL finished){
}];
Что мне нужно сделать, чтобы мой собственный метод взял блок завершения?
Я только что открыл блоки завершения:
completion:^(BOOL finished){
}];
Что мне нужно сделать, чтобы мой собственный метод взял блок завершения?
1) Определите свой собственный блок завершения,
typedef void(^myCompletion)(BOOL);
2) Создайте метод, который принимает ваш блок завершения как параметр,
-(void) myMethod:(myCompletion) compblock{
//do stuff
compblock(YES);
}
3) Вот как вы его используете,
[self myMethod:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Вы определяете блок как настраиваемый тип:
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.
Поскольку синтаксис уродливый, они часто набираются, однако они также могут быть объявлены как обычно.
typedef void (^MyFunc)(BOOL finished);
- (void)myMethod:(MyFunc)func
{
}
См. этот ответ для non typedef: