Custom completion block for my own method [duplicate]
I have just discovered completion blocks:
completion:^(BOOL finished){
}];
What do I need to do to have my own method take a completion block?
1) Define your own completion block,
typedef void(^myCompletion)(BOOL);
2) Create a method which takes your completion block as a parameter,
-(void) myMethod:(myCompletion) compblock{
//do stuff
compblock(YES);
}
3)This is how you use it,
[self myMethod:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
You define the block as a custom type:
typedef void (^ButtonCompletionBlock)(int buttonIndex);
Then use it as an argument to a method:
+ (SomeButtonView*)buttonViewWithTitle:(NSString *)title
cancelAction:(ButtonCompletionBlock)cancelBlock
completionAction:(ButtonCompletionBlock)completionBlock
When calling this in code it is just like any other block:
[SomeButtonView buttonViewWithTitle:@"Title"
cancelAction:^(int buttonIndex) {
NSLog(@"User cancelled");
}
completionAction:^(int buttonIndex) {
NSLog(@"User tapped index %i", buttonIndex);
}];
If it comes time to trigger the block, simply call completionBlock()
(where completionBlock
is the name of your local copy of the block).
Block variables are similar in syntax to function pointers in C.
Because the syntax is ugly they are often typedefed, however they can also be declared normally.
typedef void (^MyFunc)(BOOL finished);
- (void)myMethod:(MyFunc)func
{
}
See this answer for non typedef:
Declare a block method parameter without using a typedef