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
(未完待续...)