美文网首页ReactiveCocoa框架ReactiveCocoa研究iOS从入门到放弃
华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa

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

作者: 神经骚栋 | 来源:发表于2016-03-11 21:18 被阅读1239次
    人生如戏,全靠演技.



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

    相关文章

      网友评论

      • 小丫头:支持。。。
      • 泥巴锦:不错
        神经骚栋:@泥巴锦 谢谢~ :smile: 希望能对您有所帮助~
      • iOS排头兵:这种开发模式我都用两年了:smile:
        神经骚栋:@冬天里的火柴 :+1:
      • 南辰公子:顶
        神经骚栋:@南辰公子现在reactnative用的不多,只能看博客,视频是没有的~其实reactnative虽然很牛,但是也是慎用,因为如果一旦reactnative的版本不升级了,是不是就抓瞎了?
        南辰公子:@神经骚栋 有什么reactnative初级教程推荐吗,刚按你的例子写了遍,是蒙的
        神经骚栋:@南辰公子 谢谢~ :smile:

      本文标题:华山论剑之浅谈iOS中的百变金刚---ReactiveCocoa

      本文链接:https://www.haomeiwen.com/subject/tnfxlttx.html