华山论剑之浅谈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总体上来说是一个很强大的类库,虽然抽象比较难理解,但是当我们真正理解它的时候,你就会发现它其实很强大.所以学习他是一种必然,但愿我这篇文章能对您有所帮助.谢谢.😃
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容