Block-使用场景

2017-05-25  本文已影响27人  正直走
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传进去。

上一篇 下一篇

猜你喜欢

热点阅读