背景

ReactiveCocoa(简称RAC)是最初由GitHub团队开发的一套基于Cocoa的FRP框架。FRP即Functional Reactive Programming(函数式响应式编程),其优点是用随时间改变的函数表示用户输入,这样就不需要可变状态了。我们之前的文章“RACSignal的Subscription深入分析”里曾经详细讲解过RAC核心概念之一RACSignal的实现原理。在美团客户端中,我们大量使用了这个框架。冷信号与热信号的概念很容易混淆并造成一定的问题。鉴于这个问题具有一定普遍性,我将用一系列文章讲解RAC中冷信号与热信号的相关知识点,希望可以加深大家的理解。本文是系列文章的第一篇。

p.s. 以下代码和示例基于ReactiveCocoa v2.5。

什么是冷信号与热信号

冷热信号的概念源于.NET框架Reactive Extensions(RX)中的Hot Observable和Cold Observable,两者的区别是:

  1. Hot Observable是主动的,尽管你并没有订阅事件,但是它会时刻推送,就像鼠标移动;而Cold Observable是被动的,只有当你订阅的时候,它才会发布消息。

  2. Hot Observable可以有多个订阅者,是一对多,集合可以与订阅者共享信息;而Cold Observable只能一对一,当有不同的订阅者,消息是重新完整发送。

这里面的Observables可以理解为RACSignal。为了加深理解,我们来看这样的几组代码:

    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {[subscriber sendNext:@1];[subscriber sendNext:@2];[subscriber sendNext:@3];[subscriber sendCompleted];return nil;}];NSLog(@"Signal was created.");[[RACScheduler mainThreadScheduler] afterDelay:0.1 schedule:^{[signal subscribeNext:^(id x) {NSLog(@"Subscriber 1 recveive: %@", x);}];}];[[RACScheduler mainThreadScheduler] afterDelay:1 schedule:^{[signal subscribeNext:^(id x) {NSLog(@"Subscriber 2 recveive: %@", x);}];}];

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

2015-08-11 18:33:21.681 RACDemos[6505:1125196] Signal was created.
2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 1
2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 2
2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 3
2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 1
2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 2
2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 3

我们可以看到,信号在18:33:21.681时被创建,18:33:21.793依次接到1、2、3三个值,而在18:33:22.683再依次接到1、2、3三个值。说明了变量名为signal的这个信号,在两个不同时间段的订阅过程中,分别完整地发送了所有的消息。

我们再对这段代码进行一个小的改动:

    RACMulticastConnection *connection = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {[[RACScheduler mainThreadScheduler] afterDelay:1 schedule:^{[subscriber sendNext:@1];}];[[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{[subscriber sendNext:@2];}];[[RACScheduler mainThreadScheduler] afterDelay:3 schedule:^{[subscriber sendNext:@3];}];[[RACScheduler mainThreadScheduler] afterDelay:4 schedule:^{[subscriber sendCompleted];}];return nil;}] publish];[connection connect];RACSignal *signal = connection.signal;NSLog(@"Signal was created.");[[RACScheduler mainThreadScheduler] afterDelay:1.1 schedule:^{[signal subscribeNext:^(id x) {NSLog(@"Subscriber 1 recveive: %@", x);}];}];[[RACScheduler mainThreadScheduler] afterDelay:2.1 schedule:^{[signal subscribeNext:^(id x) {NSLog(@"Subscriber 2 recveive: %@", x);}];}];

稍微有些复杂,我们来一一分析:

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

抛开RACMulticastConnection是个什么东东,我们先来看下结果:

2015-08-12 11:07:49.943 RACDemos[9418:1186344] Signal was created.
2015-08-12 11:07:52.088 RACDemos[9418:1186344] Subscriber 1 recveive: 2
2015-08-12 11:07:53.044 RACDemos[9418:1186344] Subscriber 1 recveive: 3
2015-08-12 11:07:53.044 RACDemos[9418:1186344] Subscriber 2 recveive: 3

首先告诉大家- [RACSignal publish]- [RACMulticastConnection connect]- [RACMulticastConnection signal]这几个操作生成了一个热信号。 我们再来关注下输出结果的一些细节:

  • 信号在11:07:49.943被创建
  • 11:07:52.088时订阅者1才收到2这个值,说明1这个值没有接收到,时间间隔是2秒多
  • 11:07:53.044时订阅者1和订阅者2同时收到3这个值,时间间隔是3秒多

参考一开始的Hot Observables的论述和两段小程序的输出结果,我们可以确定冷热信号的如下特点:

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

好的,至此我们知道了什么是冷信号与热信号,了解了它们的特点。下一篇文章我们来看看为什么要区分冷信号与热信号。

细说ReactiveCocoa的冷信号与热信号(一)相关推荐

  1. 细说ReactiveCocoa的冷信号与热信号(三):怎么处理冷信号与热信号

    第一篇文章中我们介绍了冷信号与热信号的概念,前一篇文章我们也讨论了为什么要区分冷信号与热信号,下面我会先为大家揭晓热信号的本质,再给出冷信号转换成热信号的方法. 揭示热信号的本质 在ReactiveC ...

  2. 细说ReactiveCocoa的冷信号与热信号(二):为什么要区分冷热信号

    前一篇文章我们介绍了冷信号与热信号的概念,可能有同学会问了,为什么RAC要搞得如此复杂呢,只用一种信号不就行了么?要解释这个问题,需要绕一些圈子. 前面可能比较难懂,如果不能很好理解,请仔细阅读相关文 ...

  3. RACSignal 冷信号和热信号底层实现分析

    前言 由于最近在写关于RACSignal底层实现分析的文章,当然也逃不了关于冷热信号操作的分析.这篇文章打算分析分析如何从冷信号转成热信号的底层实现. 目录 1.关于冷信号和热信号的概念 2.RACS ...

  4. 什么是TTFF、暖开机、冷开机、热开机?

    转自:http://www.5i01.cn/topicdetail.php?f=130&t=4431 使用 GPS 尤其是用在 PDA 上,许多人被 GPS 启动搞得头晕眼花, 或以开机定位成 ...

  5. 牛人精辟辨析单端信号和差分信号

    牛人精辟辨析单端信号和差分信号 21ic电子网 昨天 单端信号 单端信号是相对于差分信号而言的,单端输入指信号有一个参考端和一个信号端构成,参考端一般为地端. 差分信号 差分传输是一种信号传输的技术, ...

  6. matlab 方波_MATLAB之Simulink(二)利用switch模块将正弦信号变为方波信号

    ##MATLAB之Simulink(二) ##利用switch模块将正弦信号变为方波信号 今天给大家展示一个simulink电路仿真,将正弦信号转化为方波信号. 下面开始教程: 1.首先直接在MATL ...

  7. linux 信号 core,Shell 信号发送与捕捉

    原标题:Shell 信号发送与捕捉 作者:李振良OK 1.Linux信号类型 信号(Signal):信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数. 进程可以通过三 ...

  8. 【数字信号处理】相关系数 ( 相关系数特点 | 完全相关 | 完全无关 | 部分相关 | 取值范围 | 相关信号产生 | 相干信号产生 )

    文章目录 一.相关系数特点 1.相关系数取值范围 2.完全相关条件 3.完全无关条件 4.部分相关条件 二.相干 与 相关 1.相干含义 2.相干信号产生 一.相关系数特点 相关系数特点如下 : 1. ...

  9. 窄带信号和宽带信号的区别和联系

    这个问题首先需要讨论宽带信号与窄带信号的定义.然而,没有文献或组织对宽带信号给出的严格定义,业内一般认为宽带信号与窄带信号是相对的,不满足窄带条件的信号就称为宽带信号.目前,窄带信号的定义也不尽相同. ...

最新文章

  1. 通知栏管理NotificationListenerService
  2. 字节跳动VQScore算法拿下ICME 2021“压缩UGC视频质量评估”比赛第一名
  3. unity深度查找某个子物体和遍历所有子物体方法
  4. 在Jetty中设置SSL
  5. C#程序设计语言2.0简介
  6. JQuery使用总结
  7. IDEA中如何将springboot项目打包成war包,部署在tomcat中
  8. matlab如何制作莫兰散点图,求大神指点绘制空间内散点图的包络面,,,散点程序如下...
  9. 12个超炫数据可视化工具_Python奇淫技巧,5个炫酷的数据可视化工具
  10. Google / Baidu 黑客搜索引擎语法详细记录
  11. 玩游戏计算机什么比较重要,台式机和笔记本玩游戏-玩游戏电脑三大件哪一个最重要? – 手机爱问...
  12. 高德地图/腾讯地图地址转换经纬度
  13. Photoshop标尺单位介绍以及录制动作标尺单位选择的重要性
  14. 硕士研究生毕业论文检测加强通过率的四大方法
  15. java将简体中文_【Java】简体中文、繁体中文转换
  16. Centos8找回拼音输入法
  17. potainer 日志_【转】专治脑壳疼 | 横扫七大烦恼!日志数据分析还可以这样做!...
  18. 一个漂亮配色的网站推荐
  19. 【毕业设计源码】基于SSM的高校学籍信息管理系统的设计与实现
  20. excel高效之拆分单元格数据、导入ppt实现修改同步

热门文章

  1. OA项目10:部门管理的三个细节问题的解决及处理懒加载问题
  2. 几个功能强大的系统源码(机票分销、机票预订、OA、手机充值、wifi营销、网络超市、体检平台)...
  3. Redis源码分析之工具类util
  4. pythongui界面小程序_python界面小程序
  5. STM32——系统滴答定时器
  6. vmware虚拟机中ubuntu上网问题
  7. 【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU
  8. android转流媒体,android 4.4中的流媒体渲染过程
  9. 大学python教材思维导图_Python核心知识体系的14张思维导图
  10. Java enum枚举