iOS 关于Blocks

*本文参考了《Objective-C高级编程 iOS与OSX多线程和内存管理》一书,关于Block的介绍摘取自此书。


Objective-c 语言中Block语法格式为:

返回值类型  参数列表  表达式 


 c语言中的函数语法格式为  

返回值类型  函数方法名  参数列表   表达式


从上面的语法可以看出,完整的Block与一般C语言函数定义相比,仅有两点不同:

(1)没有函数名

(2)带有"^”符号


以下是一个完整的Block示例:

^int (int count){return count + 1;}


在使用时Block,可以省略返回值类型,省略返回值类型时,如果表达式中又return语句,就自动使用该返回值的类型,如果没有return语句,就自动使用了void类型。表达式中含有多个return语句时,所有return的返回值必须相同,上面代码可以写成:

^(int count){return count + 1;}

另外,如果Block不带参数,则参数列表也可省略,如:

^void (void){printf("Blocks\n");}

可以写成

^{printf("Blocks\n");}


2.block类型变量

在Block语法下,可将Block语法赋值给声明为Block类型的变量中,声明Block类型变量的示例如下:

int (^blk)(int);

使用Block语法将Block赋值为Block类型的变量:

int (^blk)(int) = ^(int count){return count+1;};

因为Block类型的变量与通常的变量相同,所以也可以将Block类型变量赋值给Block类型变量:

int (^blk1)(int) = blk
也可以:

int (^blk2)(int);
blk2 = blk1;


在函数参数中使用Block类型变量可以向函数传递Block

void func(int (^blk)(int)){}

另外,可以使用typedef来简化代码,如通过typedef声明blk_t类型变量:

typedef int (^blk_t)(int);


实例:封装一个通用的网络请求函数(action为请求的方法名,parmeters为参数,请求成功获得到json数据)

伪代码如下:

typedef void(^ Failure)();
typedef void(^Success)(NSDictionary *dic);
#pragma mark - 网络操作
- (void)createAsynchronousRequest:(NSString *)action parmeters:(NSDictionary *)parmeters success:(Success)success failure:(Failure)failure {
    
   if(请求成功)
        success(responseObject);
    else{
        failure();
    }
}

使用方法如下:

[self createAsynchronousRequest:LogInAction parmeters:parameters success:^(NSDictionary *dic){
           //请求成功后在这里处理
        } failure:^{
            //请求失败后在这里处理
        }];



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值