block在开发中的使用场景
2016-07-29 本文已影响40人
eightzg
block作为函数的参数
怎么判断参数是不是block
- 看参数有没有,如果有,就是block参数
作为参数的block什么时候调用?
- 当成参数的block并不是立即调用,而是由方法的内部决定,不用外界干预,比如UIView动画

什么时候把block设计成参数?
- 做的事情由外界决定,什么时候做有方法内部决定
下面用block作为参数实现一个简单计算器
- 创建计算器管理者类CalculatorManager。在.h中声明:
/** 保存计算结果 */
@property (nonatomic, assign) NSInteger result;
// 计算方法,接收一个结果参数,将计算后的新的结果值返回出去
- (void)cacultor:(NSInteger(^)(NSInteger result))cacultorBlock;
- 在.m中实现如下
- (void)cacultor:(NSInteger (^)(NSInteger))cacultorBlock {
//用if语句做判断,防止访问不存在的block造成的坏内存访问
if (cacultorBlock) {
_result = cacultorBlock(_result);
}
}
- 在窗口的根控制器的viewDidLoad中使用如下:
- (void)viewDidLoad {
[super viewDidLoad];
// 创建计算器管理者
CacultorManager *mgr = [[CacultorManager alloc] init];
[mgr cacultor:^NSInteger(NSInteger result) {
result += 5;
result -= 2;
result *= 4;
result /= 2;
return result;
}];
NSLog(@"%zd",mgr.result);
}
- 打印结果是6

block作为函数的返回值
- block作为函数的返回值目的是替代放大,并且封装block的内部实现。
- block作为函数的返回值的经典应用框架:Masonry。Masonry的编程思想是链式编程思想,使代码可读性好。
下面用block作为返回值实现一个复杂计算器
- 首先同样创建计算器管理者类CalculatorManager。在.h中声明
/** 结果 */
@property (nonatomic, assign) int result;
/** 有参数有返回值的加方法 */
- (CalculatorManager *(^)(int))add;
- 然后在.m中实现:
- (CalculatorManager *(^)(int))add
{
//返回函数的返回值block
return ^(int value){
_result += value;
//返回block的返回值CalculatorManager,在当前控制器就是self
return self;
};
}
- 在窗口的根控制器的viewDidLoad中使用如下:
- (void)viewDidLoad {
[super viewDidLoad];
CalculatorManager *mgr = [[CalculatorManager alloc] init];
//当mgr.add(5)执行完之后result结果是5,同时block返回CalculatorManager,可以继续add(5)
mgr.add(5).add(5).add(5).add(5);
NSLog(@"%d",mgr.result);
}