- block的使用场景
举个🌰(例子),如下firstWorkday、secondWorkday、thirdWorkday三个函数分别包含三天的工作,调用每天的工作函数就会按顺序打印每天的工作内容。
void firstWorkday(){
NSLog(@"起床");
NSLog(@"洗漱");
NSLog(@"需求分析");
NSLog(@"洗漱");
NSLog(@"睡觉");
}
void secondWorkday(){
NSLog(@"起床");
NSLog(@"洗漱");
NSLog(@"编码开发");
NSLog(@"洗漱");
NSLog(@"睡觉");
}
void thirdWorkday(){
NSLog(@"起床");
NSLog(@"洗漱");
NSLog(@"技术测试");
NSLog(@"洗漱");
NSLog(@"睡觉");
}
而可以看出那三天的主要内容基本相同,只有每天所做的第三项内容不同。如果把全部的三个工作内容全部打印,按上面的方法显然是非常冗杂的。
首先我们可以将相同的工作抽成一个函数,那么我们就把第一第二项抽成一个函数,第三第四项抽成一个函数。如下
void workPrefix(){
NSLog(@"起床");
NSLog(@"洗漱");
}
void workSubfix(){
NSLog(@"洗漱");
NSLog(@"睡觉");
}
那么再次打印三份工作的内容就会相对简单,代码也相对比较精简如下:
void firstWorkday(){
goToWorkPrefix();
NSLog(@"需求分析");
goToWorkSubfix();
}
void secondWorkday(){
goToWorkPrefix();
NSLog(@"编码开发");
goToWorkSubfix();
}
void thirdWorkday(){
goToWorkPrefix();
NSLog(@"技术测试");
goToWorkSubfix();
}
我们可以将这几天的工作定义成一个block,首先我们定义一种block类型typedef void (^WorkBlock)();
void goToWork(WorkBlock workBlock)
{
NSLog(@"起床");
NSLog(@"洗漱");
// 调用block之前一定要做判断
if (workBlock != nil) {
workBlock();
}
NSLog(@"洗漱");
NSLog(@"睡觉");
}
void firstWorkday()
{
goToWork(^{
NSLog(@"了解项目的需求");
});
}
void secondWorkday()
{
goToWork(^{
NSLog(@"熟悉公司以前的代码");
});
}
void thirdWorkday()
{
goToWork(^{
NSLog(@"熟悉公司以前的代码");
});
}
当然我们上面模拟的情况,其实,使用函数将参数传进去在合适的地方打印也是可以的,但是如果goToWork
中的内容是一个方法或函数,那么利用函数传参是无法完成的,所以这时使用block
是比较合适的。所以block
比较适合的一种场景是当一个函数或方法多次使用而其中有很多重复代码,这时我们可以将每次不同的方法包装成一个block
传进去。