分类
期权交易怎么赚钱

怎么处理冷信号与热信号

A subject, represented by the RACSubject class, is a signal that can be manually controlled. Subjects can be thought of as the “mutable” variant of a signal, much like NSMutableArray is for NSArray. They are extremely useful for bridging non-RAC code into the world of signals. For example, instead of handling application logic in block callbacks, the blocks can simply send events to a shared subject instead. The subject can then be returned as a RACSignal, hiding the implementation detail of the callbacks. Some subjects offer additional behaviors as well. In particular, RACReplaySubject can be used to buffer events for 怎么处理冷信号与热信号 future subscribers, like when a network request finishes before anything is ready to handle the result.

代码先锋网 代码片段及技术文章聚合

RACSubject:信号提供者,自己可以充当信号又可以发送信号 使用场景,通常用来代替代理,有了它就可以不用定义代理了。 RACReplaySubject:重复提供信号类 RACSubject的子类 RACReplaySubject和RACSubject的区别: RACReplaySubject可以先发送信号在订阅信号,RACSubject不可以。
RACReplaySubject更像是RACSingnal 和 RACSubject 的合体版

怎么处理冷信号与热信号

冷热信号区别:

    热信号是主动的,即使你没有订阅事件,它仍然会时刻推送

一个很重要的概念

为什么要区分冷热信号呢?

RACSignal的subscirption

  1. [RACSignal createSignal]来获得signal
  2. [signal subscribNext]来获得subscriber,然后进行subscription。
  3. 进入didSubscribe,通过[subscriber sendNext] 来执行next block。

所以,其实本质仍然是

subject = 直播 signal = 点播

更多相关推荐

冷热分离 mysql_[MySQL] 基于冷热分离的LRU链表

linux内核冷热页,Linux中的冷热页机制概述

linux内核冷热页,Linux冷热页机制概念详细介绍

linux内核冷热页,Linux中的冷热页机制概述详解

linux内核冷热页,Linux中的冷热页机制概述详解

信号及信号处理笔记

一.概述 信号是一种软件中断,它提供了一种处理异步事件的方法。LInux中定有了31种不同的信号,且支持应用程序定义信号。1.产生信号的几种情况 有很多条件可以产生信号,以下便是常见的几种。当用户按下某些.

开发者头条

冷热信号的概念源于C#的MVVM框架Reactive Extensions中的Hot Observables和Cold Observables:

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

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


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

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

为什么要区分冷信号与热信号

最前面提到了RAC是一套基于Cocoa的FRP框架,那就来说说FRP,FRP全写是Functional Reactive Programming,中文译作函数响应式编程,是RP(Reactive Programm,响应式编程)的FP(Functional Programming,函数式编程)实现。说起来很拗口。太多的细节不多讨论,我们先关注下它是FP的情况。

这里有一个很重要的概念,就是任何的信号转换即是对原有的信号进行订阅从而产生新的信号。我们可以写出flattenMap的伪代码如下:


除了没有高度复用和缺少一些disposable的处理以外,上述代码可以大致的给我们 flattenMap 的直观处理,我们可以看到其实是在调用这个方法的时候,生成了一个新的信号,在这个新的信号的执行过程中对 self 进行的了 订阅 。我们还需要注意一个细节,就是这个返回信号在未来订阅的时候,才会间接的订阅了 self 。后续的 startWith 、 catchTo 等都可以这样理解。

回到我们的问题,那就是说,在fetchData被flattenMap之后,它就会因为名为title和desc信号的订阅而订阅。而后续我们对desc也进行了flattenMap得到了renderedDesc,那也说明了未来renderedDesc被订阅的时候,fetchData也会被间接订阅。所以我们解释了在后续我们用RAC宏进行绑定的时候,引发的3次fetchData的订阅。由于fetchData是冷信号,所以3次订阅意味着它的过程被执行了3次,也就是网络的3次请求。

接下来也许你会问,如果我的整个计算过程中都没有副作用,是否就不会有这个问题,答案是肯定的,试想下刚才那段代码如果没有网络请求,换成一些标准化的计算会怎样。可以肯定的是我们不会出现bug,但是不要忽视的就是其中的运算我们执行了多次。刚才在介绍纯函数的时候,还有一个概念就是引用透明,我们可以在纯函数式语言(例如Haskell)上进行一定的优化,也就是说纯函数的调用在相同参数下的返回值第二次不需要计算,所以在纯函数式语言里面的FRP并没有冷信号的担忧。然而Objective-C语言中并未对纯函数进行优化。所以拥有大规模运算的冷信号对性能也是有一定影响的。

正确理解冷信号与热信号


上述代码的 声明 了一个信号 signal , signal 指明了发送 “1” 这个值后发送 结束 事件。另外 声明 了一个信号 mappedSignal , mappedSignal 指明 signal 的值都进行一个字符串的 转换 。如果仅仅写到这里, sendNext: 和 map: 后面的block其实都没有被执行。

那究竟是何时这些block会执行呢?没错,那就是在订阅之后。订阅mappedSignal之后,还会连带的把signal订阅了。因而预先声明的部分就有了动作。

揭示热信号的本质

A subject, represented by the RACSubject class, is a signal that can be manually controlled.

Subjects can 怎么处理冷信号与热信号 be thought of as the “mutable” variant of a signal, much like 怎么处理冷信号与热信号 NSMutableArray is for NSArray. They are extremely useful for bridging non-RAC code into the world of signals.

For example, instead of handling application logic in block callbacks, the blocks can simply send events to a shared subject instead. The subject can then be returned as a RACSignal, hiding the implementation detail of the callbacks.

Some subjects offer additional behaviors as well. In particular, RACReplaySubject can be used to buffer events for future subscribers, like when a network request finishes before anything is ready to handle the result.

[转载]细说ReactiveCocoa的冷信号与热信号(一)

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

什么是冷信号与热信号

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

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

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

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

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

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