为什么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 ...
随机推荐
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- logstash服务启动脚本
logstash服务启动脚本 最近在弄ELK,发现logstash没有sysv类型的服务启动脚本,于是按照网上一个老外提供的模板自己进行修改 #添加用户 useradd logstash -M -s ...
- opengl 笔记(2)
/*- * Opengl Demo Test * * Fredric : 2016-7-10 */ #include <GLUT/GLUT.h> #include <stdlib.h ...
- ABP(现代ASP.NET样板开发框架)系列之16、ABP应用层——数据传输对象(DTOs)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之16.ABP应用层——数据传输对象(DTOs) ABP是“ASP.NET Boilerplate Project ...
- iOS App引导页功能实现
一.写作原因 以前都没有想着来写点东西,今天遇到件事情让我决定每次还是要做记录.因为以前自己可以轻松的完成pod spec的配置,但是今天在做的时候还是忘了遇到了很多坑.pod spec配置遇到的坑不 ...
- openresty 前端开发入门六之调试篇
大多数情况下,调试信息,都可以通过ngx.say打印出来,但是有的时候,我们希望打印调试日志,不影响到返回数据,所以系统打印到其它地方,比如日志文件,或者控制台 这里主要用到一个方法就是ngx.log ...
- CI Weekly #8 | CI/CD 技能进阶路线
在使用 flow.ci 进行持续集成的过程中,也许你会遇到一些小麻烦.最近我们整理了一些常见问题在 flow.ci 文档之 FAQ,希望对你有用.如果你遇到其他问题,也可以通过「在线消息」或去 Git ...
- zookeeper集群搭建
1.由于是第一次搭建zk的集群,过程中遇到些问题,给自己也给遇到问题的人提供一种可能解决问题的方法. 第一步:下载zk的最新版,我下的是3.4.9,在zk的官网,下载后解压到/usr/local ta ...
- 1. SVM简介
从这一部分开始,将陆续介绍SVM的相关知识,主要是整理以前学习的一些笔记内容,梳理思路,形成一套SVM的学习体系. 支持向量机(Support Vector Machine)是Cortes和Vapni ...
- 从零开始编写自己的C#框架(17)——Web层后端首页
后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...