编写带有block参数的函数

时间:2022-06-04 14:48:15

简介

目前在编写IOS程序的过程中,对于block的使用比较多。一般都是使用iOS写好的API自带的block,但是自己也想写一些block作为参数的函数。如果是在同一个类中,可以异步编写一些代码。如果是在不同的类中,则可以这些数据的传递。但是当把block作为函数参数的时候,如何编写这样的函数一直不知所云,这几天有空就研究了一下,下面通过几个例子来说明一下。

不带参数的block

例如 想在某个方法结束后调用另外一个方法
-(void)blockDemo1:(void(^)() )completion{
NSLog(@"this is a no-param block");
if(completion)
completion();
}

//如果想在blockDeom1这个函数调用结束后调用另外一个函数,例如调用函数afterCompletion,则可以这样进行调用
//afterCompletion
-(void)afterCompletion{
NSLog(@"afterCompletion");
}

//调用
[self blockDemo1:^{
[self afterCompletion];
}

输出结果
14:24:42.892 blockParamDemo[1519:100012] this is a no-param block
14:24:42.892 blockParamDemo[1519:100012] afterCompetion

在这个例子中block函数completion的实现就是在调用afterCompletion,就是说block函数代码的实现是在调用它所在的函数的时候才实现。在block函数做为参数的时候,它只是个参数,就像其他参数一样使用。只是如果block函数带有参数的话,就可以向这个block函数传参,这个是和其实参数不一样的地方。下面就写一个带有参数的例子。

带参数的例子

//根据code值不同,向block输入不同的值。block可以根据这些不同的值在调用blockDemo2的时候实现不同的功能
-(void)blockDeom2:(void(^)(NSString*,NSString* ))block codeName:(int) code{
switch (code) {
case 1:
if (block) {
block(@"test1",@"error1");
}
break;
case 2:
if (block) {
block(@"test2",@"error2");
}
break;
default:
if (block) {
block(nil,nil);
}
break;
}
}

//调用这个函数
[self blockDeom2:^(NSString *error_code, NSString *error){
if (error) {
NSLog(@"error_code is %@",error_code);
}else{
NSLog(@"error is nil");
}
} codeName:2];

输出结果
15:00:14.998 blockParamDemo[1678:121030] error_code is test2

如果在不同的类之间调用带block参数的函数,则就可以完成参数的传递工作。