Custom completion block for my own method
Objective CObjective C-BlocksObjective C Problem Overview
I have just discovered completion blocks:
completion:^(BOOL finished){
}];
What do I need to do to have my own method take a completion block?
Objective C Solutions
Solution 1 - Objective C
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");
}
}];
Solution 2 - Objective C
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).
Solution 3 - Objective C
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:
https://stackoverflow.com/questions/5486976/declare-a-block-method-parameter-without-using-a-typedef