高逼格的block(链式编程思想 )

链式编程思想:或许刚接触这个东西,你说满脸懵逼的状态,那么下面来看一下典型的链式编程思想的用法:

// 创建控件
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];

// 设置控件的约束
[redView mas_makeConstraints:^(MASConstraintMaker *make) {
    
    // 存放redView设置约束的代码
    make.left.top.equalTo(@10);
    make.right.bottom.equalTo(@-10);
    
}];

认识的人一眼就明白这就是

Masonry

的用法啊!

你知道怎么用?你知道实现原理么?(知道的大牛就不用往下看了,不知道的你可以往下看,谢谢你给我装逼的机会)

Masonry原理:

首先,给所有UIView提供一个设置约束的方法makeConstraints

makeConstraints的实现方法:

1.    创建约束制造者,约束制造者提供了很多设置约束的方法,每个制造约束(equalTo)的方法,方法不需要参数,但是必须返回block,每个block需要传入一个参数,计算值。

2.    把约束制造者传入block中,block用于把所有的约束保存到约束制造者中。

然后,执行block。

最后,利用约束制造者给view一次性添加所有约束。

例子中实现的是redView距离屏幕边距 10。

如果你还是懵逼状态:那么我给你总结一句话:

链式编程思想原理:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好

链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

而masonry就是很好的利用了这一思想封装的很好的第三方开源库的应用实例之一。

网上很多的demo都是用计算器的实现来解释的,我在网上找了一个很好说明这个思想的demo,仅供参考,不喜勿喷:

1.首先常规实现用法:

.h文件传递一个参数相加。

#import

@interface CalculatorManager : NSObject

/** 结果值*/
@property(assign, nonatomic) int result;

-(void)add:(int)value;

@end

.m文件实现:

#import "CalculatorManager.h"

@implementation CalculatorManager

-(void)add:(int)value
{
    _result += value;
}
@end
外部调用的时候:

-(void)viewDidLoad {
    [super viewDidLoad];

    CalculatorManager *manager = [[CalculatorManager alloc] init];

    [manager add: 1];
    [manager add: 2];
    [manager add: 3];
    [manager add: 4];

    NSLog(@"%d", manager.result);
}

2.改进用法:

在.h文件中让让返回自身self,然后在外部调用的时候:

- (void)viewDidLoad {
    [super viewDidLoad];
   
    CalculatorManager *manager = [[CalculatorManager alloc] init];
    
    [[[[manager add:1] add:2] add:3] add:4];
    
    NSLog(@"%d", manager.result);
}
这么写,代码减少了不少,但是感觉有点不舒服,那么用链式编程思想的话就有意思了:

3.一个返回值为CalculatorManager instance的Block代码块:

-(CalculatorManager *(^)(int))add
{
    //方法本身返回一个blockd代码块
    return ^CalculatorManager *(int value){
        _result += value;
        //block块内部再返回一个instance实例
        return self;
    };
}

外部实现:这有点装逼的样子了:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    CalculatorManager *manager = [[CalculatorManager alloc] init];
    
    manager.add(1).add(2).add(3).add(4);
    
    NSLog(@"%d", manager.result);
}

如果,如果你还没明白的话 ,或许跟我刚开始是一样的 对于这种编程的思想是懵逼的,给自己点时间,先记住这种用法,慢慢的你会接受这种思想的!




你可能感兴趣的:(高逼格的block(链式编程思想 ))