ReactiveCocoa学习

1.ReactiveCocoa是什么?
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,是一套基于Cocoa的FRP框架即函数响应式响应式编程,其优点是用随时间改变的函数表示用户输入,这样就不需要可变状态了。。

2.导入ReactiveCocoa框架
这里使用CocoaPods来导入
打开终端,进入工程文件的同级目录
新建一个profile文件或在原来的该文件上,输入以下内容并保存
use_frameworks!
pod 'ReactiveCocoa', '~> 2.5'

3.什么是冷信号与热信号
冷热信号的概念源于.NET框架Reactive Extensions(RX)中的Hot Observable和Cold Observable,两者的区别是:
3.1 Hot Observable是主动的,尽管你并没有订阅事件,但是它会时刻推送,就像鼠标移动;而Cold Observable是被动的,只有当你订阅的时候,它才会发布消息。
3.2 Hot Observable可以有多个订阅者,是一对多,集合可以与订阅者共享信息;而Cold Observable只能一对一,当有不同的订阅者,消息是重新完整发送。
这里面的Observables可以理解为RACSignal。

Snip20150825_3.png

以上简单地创建了一个信号,并且依次发送@1,@2,@3作为值。下面分别有两个订阅者在不同的时间段进行了订阅,运行的结果如下:

2015-08-25 17:14:21.338 MVVM[3083:94636] Signal was create.
2015-08-25 17:14:21.440 MVVM[3083:94636] Subcriber 1 reveive: 1
2015-08-25 17:14:21.441 MVVM[3083:94636] Subcriber 1 reveive: 2
2015-08-25 17:14:21.441 MVVM[3083:94636] Subcriber 1 reveive: 3
2015-08-25 17:14:22.435 MVVM[3083:94636] Subcriber 2 reveive: 1
2015-08-25 17:14:22.436 MVVM[3083:94636] Subcriber 2 reveive: 2
2015-08-25 17:14:22.436 MVVM[3083:94636] Subcriber 2 reveive: 3

例外修改下代码如下

Snip20150825_2.png

2015-08-25 17:23:46.418 MVVM[3232:100902] Signal was created.
2015-08-25 17:23:48.512 MVVM[3232:100902] Subcriber 1 receive: 2
2015-08-25 17:23:49.625 MVVM[3232:100902] Subcriber 1 receive: 3
2015-08-25 17:23:49.625 MVVM[3232:100902] Subscriber 2 recveive: 3

上面代码
1.我创建了一个信号,在1秒、2秒、3秒分别发送1、2、3这三个值,4秒发送结束信号。
2.对这个信号调用publish方法得到一个RACMulticastConnection。
3.让connection进行连接操作。
4.获得connection的信号。
5.分别在1.1秒和2.1秒订阅获得的信号。

首先- [RACSignal publish]、- [RACMulticastConnection connect]、- [RACMulticastConnection signal]这几个操作生成了一个热信号。

冷热信号的如下特点:
1.热信号是主动的,即使你没有订阅事件,它仍然会时刻推送。如第二个例子,信号在46秒被创建,47秒的时候1这个值就推送出来了,但是当时还没有订阅者。而冷信号是被动的,只有当你订阅的时候,它才会发送消息。如第一个例子。
2.热信号可以有多个订阅者,是一对多,信号可以与订阅者共享信息。如第二个例子,订阅者1和订阅者2是共享的,他们都能在同一时间接收到3这个值。而冷信号只能一对一,当有不同的订阅者,消息会重新完整发送。如第一个例子,我们可以观察到两个订阅者没有联系,都是基于各自的订阅时间开始接收消息的。

4.为什么要区分冷热信号
我们来分析副作用与冷热信号的关系。既然iOS编程中少不了副作用,那么RAC在实际的使用中也不可避免地要接触副作用。下面通过一个业务场景,来看看冷信号中副作用的坑:

Snip20150825_4.png
Snip20150825_5.png

如果你去尝试运行这段代码,你会惊奇的发现,这个网络请求发送了3次。没错,是3次请求。我们也可以想象到类似的代码存在其他副作用的问题,重新刷新了3次tableView。

下面来分析,为什么是3次网络请求呢?首先根据上面的知识,可以推断出名为fetchData信号是一个冷信号。那么这个信号在订阅的时候就会执行里面的过程。那这个信号是在什么时候被订阅了呢?仔细回看了代码,我们发现并没有订阅这个信号,只是调用这个信号的flattenMap产生了两个新的信号。

这里有一个很重要的概念,就是任何的信号转换即是对原有的信号进行订阅从而产生新的信号。

导致3次网络请求的原因就是flattenMap中会对原有的fetchData信号进行订阅。

由此可以看到,不熟悉冷热信号对业务造成的影响。我们可以想象对用户流量的影响,对服务器负载的影响,对统计的影响,如果这是一个点赞的接口,会不会造成多次点赞?后果不堪设想啊。而这些都可以通过将fetchData转换为热信号来解决。

5.怎么处理冷信号与热信号

待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 作为一个iOS开发者,你写的每一行代码几乎都是在相应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO...
    jiajia1118阅读 794评论 0 2
  • 作为一个iOS开发者,你写的每一行代码几乎都是在相应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO...
    不作不会死阅读 443评论 0 1
  • 先贴上我看的博客,大部分内容来自以下博客 入门教程 sunnyxx的博客,共四篇 美团的四篇博客 一篇关于repl...
    Auther丶阅读 3,300评论 1 40
  • ReactiveCocoa 前言 在 iOS 编程中我们需要处理各种事件,例如响应按钮的点击,监听键盘的输入,监听...
    aSnail阅读 908评论 0 2
  • 一篇关于RectiveCocoa的总结文档 百度搜索了一下RectiveCocoa,都是与MVVM关联在一起。 1...
    毒某人阅读 477评论 0 0