码迷,mamicode.com
首页 > 其他好文 > 详细

RAC(ReactiveCocoa)学习之道

时间:2016-05-13 12:11:33      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

1、ReactiveCocoa简介

  ReactiveCocoa(简称RAC),是由Github开源的一个应用于iOS和iOS开发的新框架。Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾。RAC具有函数式编程和响应式编程的特性,主要吸取了 .Net 的 Reactive Extensions 的设计和实现。

2、ReactiveCocoa作用

  在我们iOS开发过程中,经常会响应某些事件来处理某些业务逻辑,例如按钮的点击,上拉刷新,网络请求,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation)。但是这些事件都用不同的方式来处理,比如action、delegate、KVO、callback(回调)等。

  其实这些事情,都可以通过RAC处理,ReactiveCocoa为时间提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的时间,和监听的时间的代码放在一起,这样非常方便我们管理,就不需要调到对应的方法里。非常符合我们开发中 高聚合,低耦合 的思想。

3、编程思想

  在开发中我们也不能太依赖于某个框架,否则这个框架不更新了,导致项目后期没法维护,比如之前Facebook提供的 three20框架,在当时也是神器,但是后来不更新了,也就没有什么人用了。因此学习一个框架,还是有必要了解它的 编程思想

  先简单介绍下目前已知的编程思想。

  3.1、面向过程:处理时间以过程为核心,一步一步的实现。

  3.2、面向对象:万物皆对象

  3.3、链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码使代码可读性好。a(1).b(2).c(3)

    • 链式编程特点:方法的返回值必须是block,block必须有返回值(本身对象,或者可以叫方法调用者),block参数(需要操作的值或者内容)
    • 代表:masonry框架 
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    
    // mas_makeConstraints: 作用:给控件设置布局
    // - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block
    // 1、创建一个约束制造者
    // 2、调用block(maker)
    // 3、[constraintMaker install]: 遍历约束制造者的所有约束控件添加约束
    
    // 参数: block
    [redView mas_makeConstraints:^(MASConstraintMaker *make) {
        // 描述控件的约束
        
        // 上下左右间距都为10
        // make.left -> NASViewConstraint
        // make.left.top:把左边和顶部的约束全部保存到make.contrains
        
        // equalTo:方法
        // equalTo返回值: block
        make.left.top.equalTo(@10);
        make.right.bottom.equalTo(@(-10));
    }];

    下面我们通过写一个简单的计算器来学习一下链式编程思想。

    首先,我们需要创建一个继承NSObject的类,命名为CalculatorMaker,然后在 .h 文件中声明一个计算结果的属性跟一个加法计算的方法,返回值为一个block。

@property (nonatomic, assign) int result;

/** 相加 */
- (CalculatorMaker *(^)(int num))add;

    然后我们需要在 .m 文件中把这个相加的方法实现。

- (CalculatorMaker * (^)(int num))add {
    return ^(int num) {
        _result += num;
        return self;
    };
}

    这样,一个加法计算的方法就完成了,然后在ViewController中导入头文件,并在viewDidLoad中使用这个方法。

    // 1、创建计算制造者
    CalculatorMaker *maker = [[CalculatorMaker alloc] init];
    
    // 链式编程思想:maker.add(10).add(20).add(30).add(40);
    // 提供一个没有参数的add方法,返回值block
    
    int result = [maker.add(10).add(20).add(30).add(40) result];
    NSLog(@"result = %@", @(result));

    但是这样实现跟第三方Masonry实现的方法不太一样,所以接下来我们需要再写一个类,把计算器中的加、减、乘、除方法的调用整合到一起,用一个block就能实现这些功能。首先创建一个分类,继承NSObject,命名为Caculator,因为这个方法是继承自NSObject的,所以我们要先导入头文件 #import "CalculatorMaker.h", 然后在 .h 中我们先声明一个方法,以后计算都可以直接受用这个方法,一调用这个方法就返回结果。模仿着Masonry的实现方法,我们自己写一个方法。

// 以后计算都使用这个方法,一调用这个方法就返回结果
+ (int)makeCalculator:(void (^)(CalculatorMaker *))block;

    方法声明后,肯定是要实现 TA 的。下面便是实现 TA 方法的代码。返回值为 int 类型的,因为你要返回的是一个结果。

+ (int)makeCalculator:(void (^)(CalculatorMaker *))block {
    // 创建计算制造者
    CalculatorMaker *maker = [[CalculatorMaker alloc] init];
    // 计算
    block(maker);
    return maker.result;
}

    有了这个方法,那么计算器的使用就会更加的简便。下面就让我们来看看怎么实现 TA。回到 viewController.m 文件中,导入头文件 #import "NSObject+Calculator.h",然后我们就可以实现高聚合的block方法了。

int result = [NSObject makeCaculator:^(CalculatorMaker *maker) {
    // 把所有的计算代码封装到这里
    maker.add(10).add(20);
    maker.add(30).add(40);
}];
NSLog(@"result = %@", @(result));

    上面的代码输出的结果跟之前的一样,但是这样使用要比之前的使用更好,跟Masonry一样,一个block方法实现所有的功能。

    好了,链式编程思想就讲到这里了,后面深入就需要自己研究了。 

    完整代码传送门

  3.4、响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

    举个例子,如果你要求 c = a + b; 那么你必须得知道 a 跟 b 的值,先定义 a 跟 b,并给他们赋值,这是正常的思路。但是响应式编程的话,你可以先定义 a 跟 b 的值,然后让 c = a + b,在后面给 a 跟 b 赋值,把 a 跟 b 与 c 绑定了,赋值后 c 的值也会相应的改变。这就是响应式编程思想,经过上面一个小例子,相比大家应该能理解上面那句不需要考虑调用顺序,只需要考虑结果这句话的意思了吧。

    • 代表:KVO运用

    下面我们来看一下KVO的实现,

  3.5、函数式编程思想:是把操作尽量携程一系列嵌套的函数或者方法调用。

    • 函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数 block参数 (需要操作的值) block返回值 (操作结果)
    • 代表:ReactiveCocoa

 (未完待续...)

RAC(ReactiveCocoa)学习之道

标签:

原文地址:http://www.cnblogs.com/shensq/p/5482094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!