我们首先设想有如下的一个头文件:
@interface ViewController : UIViewController
{
AAA *aaa;
}
假设在这个 ViewController的viewDidLoad函数内有如下一段代码
[aaa withBlock:^(NSString* error_code, NSError* error)
{
if(!error)
{
switch ([error_code intValue]) {
case 0:
NSLog(@"获取成功!");
break;
case 1:
NSLog(@"获取失败!");
break;
default:
break;
}
}
else
{
NSLog(@"error=%@",error);
}
}];
在AAA中的.m文件有withBlock:函数的定义,如下
+(void)withBlock:(void (^)(NSString *, NSError *))block
{
[BBB success:^(RequestOperation *operation, id response)
{
NSString* code=[response objectForKey:@"error_code"];
if(block)
{
block(code, nil);
}
}
failure:^(RequestOperation *operation, NSError *error)
{
if(block)
{
block(nil, error);
}
}];
}
aaa调用了withBlock:函数,参数是block类型的。这个参数封装了一段代码,这段代码什么时候执行呢?
是在ViewController的viewDidLoad函数内执行吗?
其实是在上面打下划线的那句执行的时候,那段被封装的代码得以执行。
这样看来作为函数的参数,block块类似于回调函数或者delegate。当函数调用了,当某个事件触发,这时blocks里的内容就会运行。这样有利于代码的整合和阅读,你不需要到别处实现代理方法。
以上只讨论block作函参这一情景,如有不对之处希望网友指正,其他还有一些(这些在百度上一搜一大片,不过基本上都是转的一个人的)也值得一看。