我自己的方法的自定义完成块

我刚刚发现了完成块:

 completion:^(BOOL finished){




}];

要让我自己的方法接受一个完成块,我需要做什么?

69644 次浏览

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

因为语法很难看,所以它们通常是用类型定义的,但是它们也可以正常地声明。

typedef void (^MyFunc)(BOOL finished);


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

参见非 typedef 的答案:

不使用 typedef 声明块方法参数

1)定义自己的完成块,

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

您将该块定义为一个自定义类型:

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