一 Block基本常识
1.声明block
声明没有参数没有返回值block
void(^block1)(); block1就是该block数据类型的变量名
有返回值有参数
int(^block2)(int);
2.定义block
2.1 没有参数,没有返回值block的定义
void(^block1)() = ^{ };
2.2 有参数,有返回值block的定义
int(^block2)(int) = ^int(int a){ return a }; == int(^block2)(int) = ^(int a){ return a };
= 后面的返回值类型可以省略
注意:如果block有返回值,那么代码块中一定要有return
3.block作用
封装(保存)代码块
4.block调用
用变量名+()就可以调用
如果有参数,()内一定要写上 参数的变量名
5.block类型
block的数据类型去掉变量名 就是 block的类型
例如:void(^block1)()的block类型为 void(^)()
int(^block2)(int)的Block类型为 : int(^)(int)
6.生成block类型的快捷方式
输入inline + 回车 就会弹出block类型的定义模板
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) { <#statements#>
};
注意:苹果文档里面说明block是一个对象
![](http://upload-images.jianshu.io/upload_images/2557720-b88ff91594815aa0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
二 block的使用场景
1.block可以作为方法的参数去使用
1.1 为什么把block作为参数使用?
封装一个类,有些事情方法内部不能决定,需要外界决定,那么可以提供block给外界 , 通过block外界就可以把想做的事情传进来
经典案例:动画 和 AFN发送网络请求
动画: UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#>
[UIView animateWithDuration:2.0 animations:^{
//在这里写(外界)想做的事情
}];
AFN:
mgr GET:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull downloadProgress)downloadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>
[mgr GET:XMGBaseUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//这里写(外界)想做的事情
//参数的作用:内部得到的数据,想要传给外界,就可以通过block的参数来传递
//内部对参数赋值,在外界通过这个参数 就能够拿到这个值
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//这里写(外界)想做的事情
}];
2.block作为成员变量使用
为什么把block作为成员变量:一个类中,有些事情需要外界来决定,就可以提供一个block成员变量,外界通过对blcok赋值,就能把想做的事情传进来
不带参数的block成员变量
声明 @property (nonatomic, copy)void(^task)();
给block赋值 (set方法)
XTSettingArrowItem *item1 = [XTSettingArrowItem rowItemWithImage:nil title:@"使用兑换码" subTitle:nil];
item1.task = ^{
UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"清理缓存" message:@"帮你清理12M" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
[alertV show];
};
带参数的block成员变量
声明 @property(nonatomic,copy) void(^task)(NSIndexPath *indexPath) ;
给block赋值 (set方法)
XTSettingArrowItem *item1 = [XTSettingArrowItem rowItemWithImage:nil title:@"使用兑换码" subTitle:@"23:00"];
item1.task= ^(NSIndexPath *indexPath){
UITextField *textF = [[UITextField alloc] init];
[textF becomeFirstResponder];
//添加到当前点击的Cell上.
//获取当前点击的是哪个Cell.
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell addSubview:textF];
};