华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa
人生如戏,全靠演技.
对于ReactiveCocoa的安装,最便捷的方法无疑是CocoaPods,关于CocoaPods的使用,我的文章中曾经提到过.所以我们就看一下ReactiveCocoa是如何使用CocoaPods安装的.
ReactiveCocoa的安装
首先我们要先安装CocoaPods,这里就不说了,给大家一个关于CocoaPods的链接
---> 华山论剑之浅谈iOS第三方终结者CocoaPods
安装CocoaPods完成之后,然后使用下面的终端语句查找ReactiveCocoa.
pod search ReactiveCocoa
然后,我们就需要创建我们的Demo文件,然后cd 这个文件夹.就是在终端输入如下格式的指令;
cd + "空格" + "文件路径"
然后,我们就需要创建一个Podfile文件,输入如下的指令
touch Podfile
这时候我们就要对我们Podfile文件进行ReactiveCocoa第三方类的下载设置,两种方法,一种是输入下面的终端指令,在终端进行输入,另外一种是我们打开我们的Podfile文件输入.
vim Podfile
输入的信息如下,因为我们是用OC的最新版本 所以就是2.5版本.
platform :ios, '7.0'
pod "ReactiveCocoa", "~>2.5"
输入完成之后,我们就需要保存,所以要输入保存指令.先Esc一下,然后输入如下指令回车
:wq
这时候我们就需要下载ReactiveCocoa了.还是在终端中的当前项目目录下,运行以下命令.
pod install
下载完成之后,我们要打开那个带有ReactiveCocoa的Xcode.
ReactiveCocoa的功能
在说所有的功能之前,我要先说一下ReactiveCocoa的通俗说法.每一行代码几乎都是在相应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation)。但是这些事件都用不同的方式来处理,比如action、delegate、KVO、callback等。ReactiveCocoa为事件定义了一个标准接口,从而可以使用一些基本工具来更容易的连接、过滤和组合。
上面可能说的可能对大多数初学ReactiveCocoa的人不太清楚,你可以想象ReactiveCocoa的一个相应事件就是水龙头,水龙头需要中有水(其实官方的说法就是消息 ),然后水龙头需要一个开关,并且水龙头需要下面需要一个容器接水. ReactiveCocoa可以替代的东西很多,今天我就介绍简单介绍一下ReactiveCocoa替换代理/KVO ,谓词,映射/改变,广播/通知中心.
这里我在ViewController中做一些ReactiveCocoa功能的描述.让我们一起见证ReactiveCocoa的强大之处之前,我们首先要先导入ReactiveCocoa的库.
#import <ReactiveCocoa/ReactiveCocoa.h>
代理/KVO
我们在main.storyboard里面做一个textfield,然后在ViewController声明成属性.
代码解释 :self.myTextField的text的值相当于水龙头中的水.rac_textSignal相当于水龙头开关. subscribeNext:这个方法就相当于接水的容器.当水符合水龙头的要求的时候 ,水就会流出来.其实通过这里我们就可以看出,ReactiveCocoa是一个消息机制,self.myTextField.rac_textSignal整一个是个消息,当有消息的时候就会调用subscribeNext,这样就代替了KVO,每当myTextField的值发生改变的时候,都会发出消息.
[self.myTextField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
我们看一下输入一段字符串,然后删除会有什么效果.
谓词
我们可以使用ReactiveCocoa来达到谓词的筛选效果..
代码解释:根据上一个模块说到ReactiveCocoa可以代替KVO,可是当我们需要筛选一些不许的数据的时候,我们应该怎么做呢?代码如下,我们是使用ReactiveCocoa的一个方法filter.然后返回筛选条件,就能对我们的消息中的值进行筛选再输出了.
[[self.myTextField.rac_textSignal filter:^BOOL(NSString * value) {
return value.length >3 ;
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
我们看一下控制台输出的结果吧.控制台只会从length长度大于3开始输出.起到了谓词的效果.
映射
我们可以使用ReactiveCocoa来达到映射的效果..
代码解释: ReactiveCocoa的map方法就是起到了映射的效果.
[[[self.myTextField.rac_textSignal map:^id(NSString * value) {
return @(value.length);
}] filter:^BOOL(NSNumber *value) {
return [value integerValue]>3;
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
那么加上映射的输出结果又是如何呢?如下
广播
我们可以使用ReactiveCocoa来达到通知中心的效果.
代码解释:通知使用 ReactiveCocoa 也是能够代替的.而且使用ReactiveCocoa做广播的时候,不需要我们delloc我们的通知中心的观察者.
//添加通知中心
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"dongGe" object:nil] subscribeNext:^(id x) {
NSLog(@"吼吼!!");
}];
//发送消息
[[NSNotificationCenter defaultCenter] postNotificationName:@"dongGe" object:nil];
</br>
自定义信号
如果上面的案例不能满足我们的需求怎么办?这时候我们就需要自定义信号了.
代码解释:首先我们先创建三个小管道. switchSinal就是开关,然后就是铺设管道,铺设完之后我们就需要往其中注水.然后就会从管道中流出.
//1.关键字
RACSubject *dongGe = [RACSubject subject];
RACSubject *maincode = [RACSubject subject];
RACSubject *signalOfSignal = [RACSubject subject];
//2.开关是怎么设置的
RACSignal * switchSinal = [signalOfSignal switchToLatest];
//铺设管道.
[switchSinal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//3.为信号添加数据
[signalOfSignal sendNext:dongGe];
[dongGe sendNext:@"dongGe"];
[signalOfSignal sendNext:maincode];
[maincode sendNext:@"www.maincode.com"];
总结:ReactiveCocoa总体上来说是一个很强大的类库,虽然抽象比较难理解,但是当我们真正理解它的时候,你就会发现它其实很强大.所以学习他是一种必然,但愿我这篇文章能对您有所帮助.谢谢.😃