Custom completion block for my own method [duplicate]

╄→гoц情女王★ 提交于 2019-12-17 04:11:15

问题


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:


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");
    }
}];




回答2:


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).




回答3:


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



来源:https://stackoverflow.com/questions/16324095/custom-completion-block-for-my-own-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!