一直听闻ReactiveCocoa(以下简称RAC)的大名,但始终没有使用。最近时间比较空闲就决定研究一下。

在配置RAC时候遇到了一个小麻烦需要说明本人用cocoapods管理第三方框架,于是按照正常流程在终端中

输入pod search ReactiveCocoa,找到搜索结果

于是vim 打开Podfile 录入

pod 'ReactiveCocoa', '~> 3.0.0-alpha.1'

结果cocoapods始终安装不了 原因竟是3.0.0支持的是swift

于是重新录入pod 'ReactiveCocoa' 就能安装成功并使用了

RAC:响应式编程,使用的过程紧记一个词语Signal(信号),个人感觉RAC主要就是用信号来进行管理和操作

下面来讲解一些基本的使用方法

1.文本框普通监听,创建有usename的一个文本框

     //对象.rac_textSignal返回RACSignal对象(理解为rac信号)
//每次next事件发生时,subscribeNext:方法提供的block都会执行。
//因为对象类型已定(如此处为UITextFeild),所以形参中的属性可以转化成对应属性
[self.usename.rac_textSignal subscribeNext:^(id x) {
NSLog(@"first = %@",x);
}];

在文本框内录入abcd时得到打印结果如下

此处可以看到有多余的2个空字符串,第一行我理解为被创建的时候调用了一次block方法,第二行为成为第一响应者时调用的

由录入可以看出每当文本框有所事件时,都会调用next(下一步)方法中的block。

这样有前两个空白的明显不是我们所想要的效果,于是RAC里面就设计了filter(过滤器)来进行判定

     //filter(过滤器)用于限定subscribeNext执行条件
[[self.usename.rac_textSignal filter:^BOOL(id value) {
NSString *text = value;
return text.length >;
}] subscribeNext:^(id x) {
NSLog(@"second = %@",x);
}];

此时我们再按照上面方式录入abcd后得到打印结果

此时就得出我们想要得到的结果,但是这样看来限定条件看来只能是字符串(value)本身吗?

其实RAC还给我们提供了一个map(转换)来改变value的类别,例如

     //设置map后 filter中的value为 map块中return的对象
[[[self.usename.rac_textSignal map:^id(NSString *value) {
NSLog(@"map ===%@",value);
return @(value.length);
}] filter:^BOOL(id value) {
NSLog(@"filter ===%@",value);
return [value integerValue] > ;
}] subscribeNext:^(id x) {
NSLog(@"输出成功");
}];

此时我们同样录入abcd后得到打印结果

由此可以看出filter的类型变为了NSnumber类型,以上便是三个RAC使用最基本的知识点 map(转化) filter(过滤) next(下一步)

2.Button点击事件

平常设置button点击事件的时候还需要设置另外一个方法,在RAC中则可以不用这儿做

 #pragma mark 按钮普通设置方式
[[self.enterButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"信号1:被点击了%@",x);
}];
[[self.enterButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"信号2:被点击了%@",x);
}];
#pragma mark 按钮第二种设置方式
//点击代理事件,会使按钮可enabled一直为YES
self.enterButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(UIButton *input) {
if ([self.password.text isEqualToString:@""] && [self.usename.text isEqualToString:@"bai"]) {
NSLog(@"正确");
[[NSNotificationCenter defaultCenter] postNotificationName:@"isLogin" object:nil];
}else{
NSLog(@"错误");
}
self.name = [self.usename.text mutableCopy];
return [RACSignal empty];
}];

当我点击按钮后得到打印结果如下

这样就完成了button按钮点击的回调,在此处结果可以看出一个控件是可以创建多个signal(信号)的

3.信号合并

     //rac_textSignal 或者map:都会返回一个RACSigna类型的信号
RACSignal *usename = [self.usename.rac_textSignal map:^id(id value) {
NSString *text = value;
return @(text.length);
}];
RACSignal *password = [self.password.rac_textSignal map:^id(id value) {
NSString *text = value;
return @(text.length);
}];
//将usename同password信号合并创建新的haveTextSignal信号。combneLatest:(需要合并的信号数组)reduce:(对应信号的value)
RACSignal *haveTextSignal = [RACSignal combineLatest:@[usename,password] reduce:^id(NSNumber *usename,NSNumber *password){
return @([usename boolValue] && [password boolValue]);
}];
//设定haveTextSignal信号来控制按钮是否可以被点击
[haveTextSignal subscribeNext:^(id x) {
NSNumber *num = x;
self.enterButton.enabled = [num boolValue];
}];

此时的结果是当文本框都没有值时登录按钮不能被点击,都有值才能点击登录按钮(截图不规范,只为展示)

4.kvo和通知的RAC使用

由于kvo和通知的用法较为简单这边直接上代码

  /*
其中block会对其中对象进行强引用,为防止循环引用其中的全局对象最好采用弱引用类型
RAC语法 block外部@weakify(self) block内部@strongify(self)
接着可直接在block内部使用self
*/
//kvo
@weakify(self)
RAC(self.usename,backgroundColor) = [self.usename.rac_textSignal map:^id(id value) {
@strongify(self)
return self.usename.text.length > ? [UIColor orangeColor] : [UIColor clearColor];
}]; //Notification方法
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"isLogin" object:nil] subscribeNext:^(id x) {
NSLog(@"成功登陆");
}];

到此RAC的基本使用方法就介绍完毕,当然RAC框架的内容远远不止这些,单个人觉得这些属于比较实用部分,就只研究了这一部分。

如果以后还有RAC的研究会在此基础上增加。

Reactivecocoa初级使用的更多相关文章

  1. iOS开发之ReactiveCocoa下的MVVM(干货分享)

    最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...

  2. 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)

    马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...

  3. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  4. ReactiveCocoa 冷热订阅(cold subscribe, hot subscribe)

    ReactiveCocoa支持两种订阅方式,一种是冷订阅,一种是热订阅. 热订阅的特点: 1.不管有没有消息订阅着,发送者总会把消息发出去. 2.不管订阅者是什么时候订阅的,发送者总是会把相同的消息发 ...

  5. 为什么ReactiveCocoa中推荐使用RACSignal来做信号处理而不是RACSubject

    原文解释在这里http://cocoadocs.org/docsets/ReactiveCocoa/0.6.0/ 在标题Creating hot subscribables 底下 先贴原文: The ...

  6. 最快让你上手ReactiveCocoa之基础篇

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...

  7. [iOS]ReactiveCocoa安装方法

    1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...

  8. python 高级之面向对象初级

    python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...

  9. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

随机推荐

  1. Jquery知识

    1.窗口自适应调整 (设置layout的fit属性值为true即可) //窗口自适应调整 $(function() { windowResize(); //文档载入时加载 $(window).resi ...

  2. java 数组基本操作(一维)

    1.数组的声明: 数组类型  数组名[] 2.数组的表示方法 想使用数组中的值,可以使用索引来实现,数组是从0开始的,使用时格式为:数组名[i],比如 a[1],代表第二个值 在数组中要使用数组的长度 ...

  3. Android动画的使用总结

    1.补间动画(透明渐变.平移.旋转.缩放.组合) 方法一:通过xml文件设置 1-1:创建:res/anim 1-2:java代码写调用 Animation a = AnimationUtils.lo ...

  4. hdu1074 Doing Homework

    这题比较有意思,暴力搜索必然tle,可以用状态压缩dp解决. 我们先不考虑完成所有作业的扣分,而考虑其一个子集的情况. 假设我们得到了完成某子集S对应的作业最少扣分,我们试着向该子集中增加一个元素a, ...

  5. The Cow Lexicon

    The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8815 Accepted: 4162 Descr ...

  6. C语言typeof详解 offsetof

    http://blog.chinaunix.net/uid-28458801-id-4200573.html 前言:    typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常 ...

  7. 第十六章:网络IPC:套接字

    16.1.引言 上一章考查了各种Unix系统所提供的经典进程间通信(IPC)机制:管道.先进先出.消息队列.信号量以及共享内存.通过这些机制,同一台计算机上运行的进程可以相互通信.本章将考查不同计算机 ...

  8. 制作动画效果:《CSS3 Animation》

    在开始介绍Animation之前我们有必要先来了解一个特殊的东西,那就是"Keyframes",我们把他叫做“关键帧”,玩过flash的朋友可能对这个东西并不会陌生.下面我们就一起 ...

  9. [webkit移动开发笔记]之如何去除android上a标签产生的边框

    去年年底,做完最后一个项目就可以开开心心回家,可是在测试阶段,发现了不少bug,为了不影响回家时间,加班加点也要解决这些问题,这里算是工作回忆,也算是工作的一点小总结. 在ios4+和android2 ...

  10. 解决Duilib创建的win32窗口拖到屏幕上边缘自动最大化

    转载:http://bbs.csdn.net/topics/390842294 使用Duilib创建窗口的时候,假如有这样一个需求: 1.窗口大小规定 2.不可拖拽改变窗口大小 3.双击标题栏禁止最大 ...