我自己的方法需要一个自定义完成块

79

我刚刚发现了完成块:

 completion:^(BOOL finished){


                     }];

我需要做什么才能让我的方法接收一个完成块?


https://dev59.com/XmEi5IYBdhLWcg3wRKny#62671217 - Sunil Targe
3个回答

234

1)定义您自己的完成块(completion block)

typedef void(^myCompletion)(BOOL);

2) 创建一个方法,将您的完成块作为参数传递

-(void) myMethod:(myCompletion) compblock{
    //do stuff
    compblock(YES);
}

3)这是如何使用它的:

[self myMethod:^(BOOL finished) {    if(finished){        NSLog(@"success");    }}];

enter image description here


compclock(YES)与返回compclock = YES?相同。 - user2206906
是的,你懂了,我们可以根据需求放置compclock(YES)/ compclock(NO),在这里我们可以返回NO表示失败完成。 - Thilina Chamath Hewagama
跟踪返回值:如果(已完成)NSLog(@“成功”);否则NSLog(@“失败”); - Thilina Chamath Hewagama
2
如果你是C/C++程序员,那么我发现使用指向函数的指针语法来记忆块声明的语法非常容易。你需要做的唯一一件事就是将C/C++函数指针中的“*”替换为“^”...希望这能帮助到未来的某个人 :) - Viren
对于块中的多个参数,请使用逗号进行分隔。例如:completion:(void (^)(BOOL success, NSString* videoPath)) - Stan James
如果我的方法是prepareForSegue?!?有没有可能的方法来使用它呢?比如,如果用户想要进入下一页,我需要在prepareForSegue开始准备时显示等待动画,并在prepareForSegue方法内执行compBlock(YES)吗? - Reza.Ab

25
你需要将块定义为自定义类型:

你定义块作为自定义类型:

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是您本地复制的块的名称)。


2

块变量在语法上类似于C语言中的函数指针。

由于语法较为复杂,它们经常被typedef,但也可以正常声明。

typedef void (^MyFunc)(BOOL finished);

- (void)myMethod:(MyFunc)func
{
}

查看此答案以了解非typedef声明方法:

不使用typedef声明块方法参数


好的,谢谢。我会去查看的。对我来说有点复杂,typedef在哪里? - user2206906
1
你可以将typedef放在头文件中,在@interface之前。 - Chris Nolet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接