iOS ReactiveCocoa(RAC)学习详解
概述:
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,有时间,自己也了解学习了一下这个框架的一些基本的应用,其实你要学的话网上是有很多很多的博客给你去仔细的学习这个框架,我也把自己看到的觉得很不错的博客整理出来,方便大家以后学习也方便自己巩固这些知识!
ReactiveCocoa是做什么的?
引述自己学习的《最快让你上手ReactiveCocoa之基础篇》这篇博客里面的概述,说说 ReactiveCocoa 的作用;
- 在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。
- 比如按钮的点击使用action,ScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式。
- 其实这些事件,都可以通过RAC处理
- ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中
高聚合,低耦合的思想。
这是博客里面作者的概述,其实作者已经说的很明白了,简单点的一句话总结,ReactiveCocoa 其实就是一个用来帮我们处理事件的一个三方的框架!
学习的博客里面是通过总结我们常见编程思想来入手给我们讲解ReactiveCocoa这个框架的,把所知的编程思想罗列出来,你要觉得你还是没有理解这些编程思想或者有所疑惑的话,你都可以去上网搜搜或者翻翻我学习的文章去看看。
一 面相对象:处理事情以过程为核心,一步一步的实现。
解释:用以前常说的怎么把大象放在冰箱里面为例,你要从面向过程去考虑的话你就得一步一步的把这个整个过程拆分开去做。
第一步:把大象剁了(当然,只是这样说说而已,别真的这样做,我们还是要保护大象!只为解释一下这个面相过程的思想O(∩_∩)0)。
第二步:把冰箱门打开。
第三步:一块块的把大象放进去。
第四步:把冰箱门关上,这就是面相过程你所需要考虑的。
二 面相对象:万物皆对象
同样以上面的过程为例,你需要考虑的只是把冰箱打开,把大象放进去就行了,至于怎么放这些步骤你就不需要考虑了,我们只关心对象,不关心过程。
三 链式编程思想:关注于数据流和变化传播,是将多个操作通过点号(.)链接在一起成为一句代码,使代码可读性好。像这样调用a(1).b(2).c(3)
代表:masonry框架。
四 响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
代表:KVO运用。
五 函数式编程思想:例如函数用其他函数作为参数。
代表:ReactiveCocoa。
上面这么多,就把它的作用和它所用的编程思想做了一个类比和分析。看看它的基本的使用:
先说说安装:
这个的话我自己是强烈建议使用Cocoapods的,还不知道怎么安装的看以前的博客《CocoaPods 2016最新安装和使用说明》,把安装的终端代码给大家参考:
target 'RaectiveCocoaTest' do
use_frameworks!
pod 'ReactiveCocoa', '~>4.0.2-alpha-1'
end
ReactiveCocoa 的使用:
三方开头头文件先行:#import "ReactiveCocoa"
一 RACSiganl (信号类):你可以把下面代码放在你的控制器当中运行一遍,我们看着代码解释这个类;
RACSignal * singel = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// subscriber 是订阅者,这是一个协议,不是一个类。发送信号 1
[subscriber sendNext:@2];
// 发送完成
[subscriber sendCompleted];
// RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
// 执行完Block后,当前信号就不在被订阅了。
return [RACDisposable disposableWithBlock:^{
NSLog(@"信号被销毁");
}];
}];
//singel信号类调用subscribeNext方法订阅信号。订阅之后才会激活这个信号,注意顺序!
[singel subscribeNext:^(id x) {
// block调用时刻:每当有信号发出数据,就会调用block.
NSLog(@"接收到数据:%@",x);
}];
XCode打印出:
2016-08-09 15:12:53.437 RaectiveCocoaTest[21421:170391] 接收到数据:2
2016-08-09 15:12:53.438 RaectiveCocoaTest[21421:170391] 信号被销毁
解释:
1:RACSiganl(信号类)只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者subscriber去发出。
2:默认一个信号都是冷信号,就算是值改变了,但你没有订阅这个信号的话它也不会触发的,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
二:RACSubject(信号提供者)它自己可以充当信号,又能发送信号。
RACReplaySubject (信号重复提供者)它是RACSubject的子类。
RACSubject * subject = [RACSubject subject];
// 自己订阅了信号
[subject subscribeNext:^(id x) { NSLog(@"第一个订阅者%@",x); }]; [subject subscribeNext:^(id x) { NSLog(@"第二个订阅者%@",x ); }]; // 自己发送了信号
[subject sendNext:@"520"];
XCode打印:
2016-08-09 15:41:44.464 RaectiveCocoaTest[23130:189079] 第一个订阅者520
2016-08-09 15:41:44.464 RaectiveCocoaTest[23130:189079] 第二个订阅者520
// 1.创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject]; // 2.发送信号
[replaySubject sendNext:@11];
[replaySubject sendNext:@22]; // 3.订阅信号
[replaySubject subscribeNext:^(id x) { NSLog(@"第一个订阅者接收到的数据%@",x);
}]; // 订阅信号
[replaySubject subscribeNext:^(id x) { NSLog(@"第二个订阅者接收到的数据%@",x);
}];
XCode打印:
2016-08-09 15:45:03.728 RaectiveCocoaTest[23370:191718] 第一个订阅者接收到的数据1
2016-08-09 15:45:03.728 RaectiveCocoaTest[23370:191718] 第一个订阅者接收到的数据2
2016-08-09 15:45:03.728 RaectiveCocoaTest[23370:191718] 第二个订阅者接收到的数据1
2016-08-09 15:45:03.729 RaectiveCocoaTest[23370:191718] 第二个订阅者接收到的数据2
解释:这里大家可以仔细看看,你不管第一次还是第二次订阅之后,它是把你以前发送的消息全都接受了一遍!而且它们俩的区别也要注意:
RACReplaySubject可以先发送信号,在订阅信号,RACSubject就不可以。
扩展:在上面学习的博客当中, RACSubject这个类是可以用来代替代理的,这里篇幅怕太长,影响大家阅读的内心,就不粘贴代码了,你可以去《最快让你上手ReactiveCocoa之基础篇》学习写一下,其实我建议大家已经掌握了他最基本的使用之后,可以自己尝试写一下,难度也不大。
三:RACSequence RAC中的集合类,可用来快速遍历数组,字典!
RACTuple RAC中的元组类,类似NSArray,用来包装值。看下面简单的使用。
先说说这个 RACSequence的简单使用;
//遍历数组
NSArray *numbers = @[@1,@2,@3,@4]; // 这里其实是三步
// 第一步: 把数组转换成集合RACSequence numbers.rac_sequence
// 第二步: 把集合RACSequence转换RACSignal信号类,numbers.rac_sequence.signal
// 第三步: 订阅信号,激活信号,会自动把集合中的所有值,遍历出来。
[numbers.rac_sequence.signal subscribeNext:^(id x) { NSLog(@"%@",x); }];
XCode打印
2016-08-09 16:24:55.445 RaectiveCocoaTest[25803:220322] 1
2016-08-09 16:24:55.446 RaectiveCocoaTest[25803:220322] 2
2016-08-09 16:24:55.446 RaectiveCocoaTest[25803:220322] 3
2016-08-09 16:24:55.446 RaectiveCocoaTest[25803:220322] 4
// 遍历字典,遍历出来的键值对会包装成RACTuple(元组对象
NSDictionary *dict = @{@"name":@"张旭",@"age":@24};
[dict.rac_sequence.signal subscribeNext:^(RACTuple *x) { // RACTuple 就是一个元组,元组的概念在Swift有专门的介绍,没掌握的可以自己上网查一下!
NSLog(@"RACTuple = %@",x);
// 解包元组,会把元组的值,按顺序给参数里面的变量赋值
RACTupleUnpack(NSString *key,NSString *value) = x; // 相当于以下写法
// NSString *key = x[0];
// NSString *value = x[1]; NSLog(@"%@ %@",key,value); }];
XCode打印:
2016-08-09 16:12:21.204 RaectiveCocoaTest[25041:211762] RACTuple = <RACTuple: 0x7f9703d17860> (
name,
"\U5f20\U65ed"
)
2016-08-09 16:12:21.205 RaectiveCocoaTest[25041:211762] name 张旭
2016-08-09 16:12:21.206 RaectiveCocoaTest[25041:211762] RACTuple = <RACTuple: 0x7f9703e0ae60> (
age,
24
)
2016-08-09 16:12:21.206 RaectiveCocoaTest[25041:211762] age 24
解释:上面的注释里面解释就写得和很清楚了,就不在下面单独作解释了。
四:RACCommand
RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。
使用场景:监听按钮点击,网络请求
五 RACMulticastConnection
用于当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block,造成副作用,可以使用这个类 处理。
这两部分的内容自己还没好好研究,后面会补充。需要可以先去前面看看。
ReactiveCocoa常见的方法:
1 代替代理: rac_signalForSelector:用于替代代理。
2 代替KVO : rac_valuesAndChangesForKeyPath:用于监听某个对象的属性改变。
3 监听事件: rac_signalForControlEvents:用于监听某个事件。
4 代替通知: rac_addObserverForName:用于监听某个通知。
5 监听文本框文字改变: rac_textSignal:只要文本框发出改变就会发出这个信号。
6 处理当界面有多次请求时,需要都获取到数据时,才能展示界面;rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发第一个selector参数的方法。
使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。
上面这部分是由代码示例的,我学习的博客作者是写了的,大家可以去看看学习一下。
学习链接给大家:
最快让你上手ReactiveCocoa之基础篇
ReactiveCocoa入门教程:第一部分
ReactiveCocoa入门教程: 第二部分
iOS ReactiveCocoa(RAC)学习详解的更多相关文章
- IOS 友盟使用详解
IOS 友盟使用详解 这篇博客将会详细介绍友盟的使用,希望对博友们有所帮助. 首先我们在浏览器上搜索友盟. 在这里我们选择官网这个,进去友盟官网后我们按照下图进行选择. 接下来选择如下图 Next 这 ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
- ios新特征 ARC详解
IOS ARC 分类: IOS ARC2013-01-17 09:16 2069人阅读 评论(0) 收藏 举报 目录(?)[+] 关闭工程的ARC(Automatic Reference Co ...
- iOS 单元测试之XCTest详解(一)
iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...
- IOS—UITextFiled控件详解
IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGR ...
- iOS原生地图开发详解
在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...
- 弹性布局学习-详解align-content(六)
弹性布局学习-详解align-content(六)
- 弹性布局学习-详解 justify-content(三)
弹性布局学习-详解 justify-content(三)
- 弹性布局学习-详解 flex-direction【决定主轴的方向】(二)
弹性布局学习-详解 flex-direction[决定主轴的方向](二)
随机推荐
- CodeForces 652B z-sort
先对序列排个序. 例如:1 2 3 4 5 6 7 我们把序列分成两半,前一半是1 2 3 4,后一半是5 6 7 然后,我们从前一半取最小的一个,再从后一半取最小的一个..一直操作下去就能构造出答案 ...
- R语言实战(四)回归
本文对应<R语言实战>第8章:回归 回归是一个广义的概念,通指那些用一个或多个预测变量(也称自变量或解释变量)来预测响应变量(也称因变量.效标变量或结果变量)的方法.通常,回归分析可以用来 ...
- Ural Vol1(dif>=900)
目前已AC: 2 1040.Airline Company(构造) 题目要求与每个顶点相连的所有边编号最大公约数为1,其实只要其中的两条边编号互质,所有边编号的最大公约数一定为1.我们知道相邻的数字 ...
- 关于学习方法的借鉴和有关C语言学习的调查
专长的高超技能获取的成功经验 在游戏方面,我相对于大多数人来说可能更为出色.首先是我投入了大量的时间进行游戏:其次,我几乎每天都会看一会教学视频来模仿:最后应该还是跟个人的天赋有点关系. 如果把这个类 ...
- UVa 757 - Gone Fishing
题目大意:John有h的时间可以去钓鱼,有n湖可钓鱼,以5分钟为时间单位,每个湖初始每个单位时间可钓f条鱼,每下一个时间单位数量减少d条.同时,John只能从1号湖往后走进行钓鱼,湖之间的距离需要t个 ...
- iOS 专题 之 界面开发 之 控件
iOS 之 UIViewController iOS 之 Navagation Button iOS 之 UIButton iOS 之 UITextField iOS 之 UIStackView iO ...
- maven 第一次运行报错
在大中国的网络环境下,使用一些国外的资源,是一件很痛苦的事情... 大概在好几个月以前,一个同事跟我说,没事的时候学习maven,现在公司项目都用这个做管理 还给了我电子书<Maven实战> ...
- Java 之 web.xml(Java之负基础实战)
多个web.xml会同时生效,先加载tomcat下的web.xml,再加载网站目录下的web.xml. 1.tomcat自带的web.xml 在tomcat的conf目录下 2.自定义web.xml ...
- Android中关闭应用的三种方式
当应用不再使用的时候,通常需要关闭应用,我们可以使用三种方式关闭android应用: 第一种方式:首先获取当前进程的id,然后杀死该进程(推荐) android.os.Process.killProc ...
- GWAS
GWAS的数据形式:SNP数据,即各个SNP位点的aa,Aa,AA基因型与疾病状态(0正常,1患病)的样例-对照数据. 在遗传流行病学上,全基因组关联研究(Genome Wide Associatio ...