天天看点

编写带有block参数的函数

简介

目前在编写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参数的函数,则就可以完成参数的传递工作。