华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa

人生如戏,全靠演技.



对于ReactiveCocoa的安装,最便捷的方法无疑是CocoaPods,关于CocoaPods的使用,我的文章中曾经提到过.所以我们就看一下ReactiveCocoa是如何使用CocoaPods安装的.


ReactiveCocoa的安装


首先我们要先安装CocoaPods,这里就不说了,给大家一个关于CocoaPods的链接

---> 华山论剑之浅谈iOS第三方终结者CocoaPods

安装CocoaPods完成之后,然后使用下面的终端语句查找ReactiveCocoa.

pod search ReactiveCocoa

华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa_第1张图片

然后,我们就需要创建我们的Demo文件,然后cd 这个文件夹.就是在终端输入如下格式的指令;

cd + "空格" + "文件路径"

然后,我们就需要创建一个Podfile文件,输入如下的指令

touch Podfile

华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa_第2张图片

这时候我们就要对我们Podfile文件进行ReactiveCocoa第三方类的下载设置,两种方法,一种是输入下面的终端指令,在终端进行输入,另外一种是我们打开我们的Podfile文件输入.

vim Podfile

输入的信息如下,因为我们是用OC的最新版本 所以就是2.5版本.

platform :ios, '7.0'
pod "ReactiveCocoa", "~>2.5"

输入完成之后,我们就需要保存,所以要输入保存指令.先Esc一下,然后输入如下指令回车

:wq

这时候我们就需要下载ReactiveCocoa了.还是在终端中的当前项目目录下,运行以下命令.

pod install

下载完成之后,我们要打开那个带有ReactiveCocoa的Xcode.

华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa_第3张图片

ReactiveCocoa的功能


在说所有的功能之前,我要先说一下ReactiveCocoa的通俗说法.每一行代码几乎都是在相应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation)。但是这些事件都用不同的方式来处理,比如action、delegate、KVO、callback等。ReactiveCocoa为事件定义了一个标准接口,从而可以使用一些基本工具来更容易的连接、过滤和组合。

上面可能说的可能对大多数初学ReactiveCocoa的人不太清楚,你可以想象ReactiveCocoa的一个相应事件就是水龙头,水龙头需要中有水(其实官方的说法就是消息 ),然后水龙头需要一个开关,并且水龙头需要下面需要一个容器接水. ReactiveCocoa可以替代的东西很多,今天我就介绍简单介绍一下ReactiveCocoa替换代理/KVO ,谓词,映射/改变,广播/通知中心.

这里我在ViewController中做一些ReactiveCocoa功能的描述.让我们一起见证ReactiveCocoa的强大之处之前,我们首先要先导入ReactiveCocoa的库.

#import


代理/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);
        
    }];

我们看一下输入一段字符串,然后删除会有什么效果.


华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa_第4张图片


谓词


我们可以使用ReactiveCocoa来达到谓词的筛选效果..

代码解释:根据上一个模块说到ReactiveCocoa可以代替KVO,可是当我们需要筛选一些不许的数据的时候,我们应该怎么做呢?代码如下,我们是使用ReactiveCocoa的一个方法filter.然后返回筛选条件,就能对我们的消息中的值进行筛选再输出了.
  [[self.myTextField.rac_textSignal filter:^BOOL(NSString * value) {
        
        return value.length >3 ;
        
    }] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    

我们看一下控制台输出的结果吧.控制台只会从length长度大于3开始输出.起到了谓词的效果.

华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa_第5张图片


映射


我们可以使用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);
    }];

那么加上映射的输出结果又是如何呢?如下

华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa_第6张图片


广播


我们可以使用ReactiveCocoa来达到通知中心的效果.

代码解释:通知使用 ReactiveCocoa 也是能够代替的.而且使用ReactiveCocoa做广播的时候,不需要我们delloc我们的通知中心的观察者.
 //添加通知中心
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"dongGe" object:nil] subscribeNext:^(id x) {
        
        NSLog(@"吼吼!!");
        
    }];
    
    //发送消息
    [[NSNotificationCenter defaultCenter] postNotificationName:@"dongGe" object:nil];


自定义信号


如果上面的案例不能满足我们的需求怎么办?这时候我们就需要自定义信号了.

代码解释:首先我们先创建三个小管道. 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总体上来说是一个很强大的类库,虽然抽象比较难理解,但是当我们真正理解它的时候,你就会发现它其实很强大.所以学习他是一种必然,但愿我这篇文章能对您有所帮助.谢谢.

你可能感兴趣的:(华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa)