欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-21 23:49:10
...
人生如戏,全靠演技.



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


ReactiveCocoa的安装


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

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

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

pod search ReactiveCocoa

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

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

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

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

touch Podfile

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

这时候我们就要对我们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

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

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


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


谓词


我们可以使用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


映射


我们可以使用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


广播


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