RAC(ReactiveCocoa)学习之道

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

(未完待续...)

时间: 2024-11-06 14:28:41

RAC(ReactiveCocoa)学习之道的相关文章

响应式编程框架ReactiveCocoa学习——框架概览

这篇博客将会继续翻译RAC的官方文档Framework Overview. 主要是对RAC这和框架进行概览的介绍和学习.同时也可以参考我前面的两篇翻译<响应式编程框架ReactiveCocoa学习--基本操作符><响应式编程框架ReactiveCocoa介绍与入门>.其中ReactiveCocoa的Github官方地址为 https://github.com/ReactiveCocoa/ReactiveCocoa . 这篇文档包括了RAC中的对不同组件的高层描述,并解释如何进行结合

JavaFX学习之道:JavaFX之TableView

TableView表 TableColumn列 构建一个表主要有TableView,TableColumn,ObservableList,Bean. 添加列table.getColumns().addAll(firstNameCol, lastNameCol, emailCol); ObservableList里面是存放的数据 table.setItems(observableList);添加数据 observableList里面一般是存放的Bean,列与Bean之间建立联系,从而获取值. 列与

Java学习之道:jdk环境变量配置方法

JDK(Java Development Kit)是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库.JDK作为JAVA开发的环境,不管是做JAVA开发还是做安卓开发,都必须在电脑上安装JDK. 64位下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html jdk环境变量配置方法: 在安装完jdk后,还需要对jdk的环境变量进行配置才能正常使用,下面教大家如何配置jdk环境变量: 1

php学习之道:php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供一种办事接口的统称. WSDL提供"能办的事的文档说明":  对要提供的服务的一种描述格式.我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型. SOAP提供"请求"的规范:  向服务接口传递请求的格式,包括方法和参数等.你想让人家办事,总得告诉人家

php学习之道:WSDL详解(三)

通过声明方式定义绑定(binding)属性 如果你在服务中采用SOAP binding,你可以使用JAX-WS来指定一定数量的属性binding.这些属性指定对应你在WSDL中指定的属性.某些设置,比如参数类型,可以约束你实现的方法,这些设置也影响声明的效用. @SOAPBinding声明,定义在javax.jws.soap.SOAPBinding接口中.它提供发布时的SOAP Binding细节.如果@SOAPBinding没有被指定,则用缺省的doc/literal SOAPBinding.

JavaFx学习之道:JavaFx初步了解

因为项目的需要,实在是没有办法了,试了很多种方案(RCP,SWT,Flex,Smartinvoke...),最终还是决定开始研究JavaFx...为了给用户更好地体验我们的"智能家居"! 以下是最近搜索得到的一些资料: 1.Oracle 上 JavaFx的下载页面:http://www.oracle.com/technetwork/java/javafx/overview/index.html 目前最新版本的SDK是2.1 JavaFX 2.1 Developer Preview -

php学习之道:php中iconv函数 详解

iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库. 用法如下: $string = "亲爱的朋友欢迎访问胡文芳的博客,希望给您带来一点点的帮助!"; iconv("utf8","gbk",$string)//将字符串string  编码由utf8转变成gbk: 扩展如下: echo $str= '你好,欢迎访问胡文芳的博客,该博客记录一个程序员的成长过程!'; echo ' '; echo iconv('GB2312

php学习之道:php empty()和isset()的区别

在使用 php 编写页面程序时,我经常使用变量处理函数判断 php 页面尾部参数的某个变量值是否为空,开始的时候我习惯了使用 empty() 函数,却发现了一些问题,因此改用 isset() 函数,问题不再. 顾名思义,empty() 判断一个变量是否为"空",isset() 判断一个变量是否已经设置.正是这种所谓的"顾名思义",令我开始时走了些弯路:当一个变量值等于0时,empty()也会成立(True),因而会发生一些意外.原来,empty() 和 isset(

php学习之道:php 流程控制语句

PHP控制语句 1.IF语句 IF语句是多数语言中的一个重要特点,它根据条件执行程序段.PHP的IF语句类似于 C: if (expr) statement 正如在表达式中所论述, expr 被计算为它的真值.如果 expr 为TRUE, PHP执行相应语句, 如果为FALSE 则忽略它. 如果$a 大于 $b,下例将显示 'a is bigger than b': if ($a >$b) print "a is bigger than b"; 通常,你希望根据条件执行多于一条语