为什么ReactiveCocoa中推荐使用RACSignal来做信号处理而不是RACSubject
原文解释在这里http://cocoadocs.org/docsets/ReactiveCocoa/0.6.0/ 在标题Creating hot subscribables 底下
先贴原文:
The easiest way to create hot subscribables is by using RACSubject. Subjects are subscribables you can manually control with -sendNext:, -sendError:, -sendCompleted. Those will send the corresponding events to the subject's subscribers.
Remember that hot subscribables send events regardless of whether anyone's listening. Sometimes that's fine, but often we'd actually like to avoid missing any events.
Suppose that we're using RAC to interact with a web API. (In fact, that's exactly what the GHAPIDemo does.) We'd probably return a subject from our request method and the subject would send the value of the API call.
But there's a race condition here. If the API call sends its result and completes before I have a chance to subscribe, then I completely missed the whole point of the API call and I'd never know it.
Because of this, RAC has a few RACSubject subclasses:
- RACAsyncSubject. It doesn't send any value until it completes and if anyone subscribes after it has completed, it resends the last value it received to that new subscriber and tells the subscriber it's completed.
- RACReplaySubject. It remembers every value it sends (or some pre-defined cut-off you give it) and replays those to any subscriber that misses them.
- RACBehaviorSubject. It remembers the last value it received and sends that to any new subscribers that missed it.
注:Subject->发送者,Subscriber->订阅者,Signal->信号
主要还是要看原文
原文的意思稍微翻译一下:
1、关于RACSubject:创建一个热订阅的最简单方法是用RACSubject, Subject(其本身是一个发送者,也就是它既能订阅又能发送信号)是可以用来主动控制sendNext:,sendError,sendCompleted,等操作的一个订阅者,它会将相同的事件发给订阅者。
2、热订阅传递事件的时候是会忽略所有的监听(造成监听实效了。)。有时候这种方式的消息传递不会造成影响,通常我们是希望规避一些风险操作以免造成事件丢失。
举个例子:如果我们用RAC去处理一个web API的请求,我们可以从请求结果中返回一个subject对象,然后subject会将request中拿到的结果传递出来。这时候有一种情况是。如果API的send 和 。 complete 的方法在 传递信号之前,我们的的整个网络请求的结果就丢失了,并且我们还不会知道是因为这个丢失的。
RACSubject 有3个子类RACAsyncSubject,RACReplaySubject,RACBehaviorSubject.
RACAsyncSubject:这个类定义的发送者会在它本身事件完成,或者它的下一步完成的时候把它接收到的最新的值传递给下一个订阅者。
RACReplaySubject: 这个类会记住它接收过的所有值,并且将这些值中的一些传递给那些对应的丢失值的订阅者。
RACBehaviorSubject:这个类会记住最后一个它接收到的值,并且将它发送给任意一个丢失过这个值的新的订阅者
原因在红色英文那段,具体的跟热订阅如何处理( 跟RACSubject字类的关系)有关吧
为什么ReactiveCocoa中推荐使用RACSignal来做信号处理而不是RACSubject的更多相关文章
- ReactiveCocoa 中 RACSignal 是怎样发送信号
前言 ReactiveCocoa是一个(第一个?)将函数响应式编程范例带入Objective-C的开源库.ReactiveCocoa是由Josh Abernathy和Justin Spahr-Summ ...
- ReactiveCocoa 中 RACSignal 是如何发送信号的
https://juejin.im/post/5829f4c3570c350063c436ac 前言 ReactiveCocoa是一个(第一个?)将函数响应式编程范例带入Objective-C的开源库 ...
- oracle中临时表是用来做什么的
oracle中临时表是用来做什么的 某些情况下, 需要 多个非常大的表关联的情况下, 但是需要检索的, 是少量的数据的时候.可以先把 大表的数据, 检索出那一小部分, 然后插入到 临时表中, 最后再关 ...
- jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)
原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jd ...
- 读取同一文件夹下多个txt文件中的特定内容并做统计
读取同一文件夹下多个txt文件中的特定内容并做统计 有网友在问,C#读取同一文件夹下多个txt文件中的特定内容,并把各个文本的数据做统计. 昨晚Insus.NET抽上些少时间,来实现此问题,加强自身的 ...
- NLP中的用N-gram语言模型做英语完型填空的环境搭建
本文是对xing_NLP中的用N-gram语言模型做完型填空这样一个NLP项目环境搭建的一个说明,本来想写在README.md中.第一次用github中的wiki,想想尝试一下也不错,然而格式非常的混 ...
- 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的 ...
- 推荐两个Magento做的中文网站 GAP和佰草集
Magento这两年发展很快,可以算是现阶段最有前途的开源电子商务系统,国外用的人很多,相对应的,国内也已经有很多人在用Magento建站了,可惜的是这其中绝大多数还是英文站,大多是国内外贸商建的外贸 ...
- 在linux中给你的应用做压力测试
在linux中给你的应用做压力测试 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 一.webbench 1.在Ubuntu中安装webbench —支持get,h ...
随机推荐
- 绿色版的Linux.NET——“Jws.Mono”(续)
在前一篇文章中,我们简略的介绍了jws.mono的安装使用,以及我们如何自己动手做一个jws.mono出来. 在文章发表之后的几天里,我一直觉得有点不妥之处,直到后来猛然的意识到:我们自己动手做的jw ...
- 自制文件上传JS控件,支持IE、chrome、firefox etc.
(function() { if (window.FileUpload) { return; } window.FileUpload = function (id, url) { this.id = ...
- what's deviceone
DeviceOne技术介绍 一. DeviceOne是什么 DeviceOne(以下简称Do)是一个移动开发的平台或技术,与之对等的是Android移动开发技术,iOS移动开发技术,Windo ...
- Jquery双向select控件Bootstrap Dual Listbox
效果预览: 一. 下载插件 github地址:https://github.com/istvan-ujjmeszaros/bootstrap-duallistbox 也可以在这个网站中下载:http: ...
- Kinect开发文章目录
整理了一下去年为止到现在写的和翻译的Kinect的相关文章,方便大家查看.另外,最近京东上微软在搞活动, 微软 Kinect for Windows 京东十周年专供礼包 ,如果您想从事Kinect开发 ...
- 利用AOP写2PC框架(二)
AOP的底层已经封装好了以后,我们就要开始针对应用层写具体的业务逻辑了. 也就是说我们需要有个类继承于AopProxyBase,并且重写其After,Bofore以达到我们的拦截记录的功能.代码如下: ...
- 自定义ActionBar标题与菜单中的文字样式
自定义标题文字样式 标题样式是ActionBar样式的一部分,所以要先定义ActionBar的样式 <style name="AppTheme" parent="A ...
- redis成长之路——(五)
单例.哨兵.Cluster redis应用广泛,主要体现于实际场景的可用化,但是对于码农来说初步入手很多理念难以理解:码农的想法就是:为什么我要管那么多,我只想用,能用就行!所以必须将三个场景透明化. ...
- JavaScript随笔7
BOM (1). window.open('窗口','_self或者_blank');//打开一个新的浏览器窗口 例 var win = window.open('about:blank');//获取 ...
- select,epoll,poll比较
介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...