天天看点

iOS中block作为一个函数的参数

我们首先设想有如下的一个头文件:

@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作函参这一情景,如有不对之处希望网友指正,其他还有一些(这些在百度上一搜一大片,不过基本上都是转的一个人的)也值得一看。