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

来源:互联网 发布:mac电脑键盘清理 编辑:程序博客网 时间:2024/05/21 17:21

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

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

原创粉丝点击