南宁保洁网站建设,没经验的人开什么店好,如何申请企业微信,湖南常德通报1例复阳病例背景 ReactiveCocoa#xff08;简称RAC#xff09;是最初由GitHub团队开发的一套基于Cocoa的FRP框架。FRP即Functional Reactive Programming#xff08;函数式响应式编程#xff09;#xff0c;其优点是用随时间改变的函数表示用户输入#xff0c;这样就不需要可变状态了… 背景 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两者的区别是 Hot Observable是主动的尽管你并没有订阅事件但是它会时刻推送就像鼠标移动而Cold Observable是被动的只有当你订阅的时候它才会发布消息。Hot Observable可以有多个订阅者是一对多集合可以与订阅者共享信息而Cold Observable只能一对一当有不同的订阅者消息是重新完整发送。 这里面的Observables可以理解为RACSignal。为了加深理解我们来看这样的几组代码 RACSignal *signal [RACSignal createSignal:^RACDisposable *(idRACSubscriber 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);}];}]; 以上简单地创建了一个信号并且依次发送123作为值。下面分别有两个订阅者在不同的时间段进行了订阅运行的结果如下 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 *(idRACSubscriber 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的论述和两段小程序的输出结果我们可以确定冷热信号的如下特点 热信号是主动的即使你没有订阅事件它仍然会时刻推送。如第二个例子信号在50秒被创建51秒的时候1这个值就推送出来了但是当时还没有订阅者。而冷信号是被动的只有当你订阅的时候它才会发送消息。如第一个例子。热信号可以有多个订阅者是一对多信号可以与订阅者共享信息。如第二个例子订阅者1和订阅者2是共享的他们都能在同一时间接收到3这个值。而冷信号只能一对一当有不同的订阅者消息会从新完整发送。如第一个例子我们可以观察到两个订阅者没有联系都是基于各自的订阅时间开始接收消息的。好的至此我们知道了什么是冷信号与热信号了解了它们的特点。下一篇文章我们来看看为什么要区分冷信号与热信号。