ReactiveCocoa源码拆分解析(三)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载)
这一章节主要讨论信号的“冷”与“热”
在RAC的世界里,信号是有“冷”(被动passive)与“热”(主动active)之分的。而且一不小心,这就可能成为了严重的问题,具体可以参见案例http://tech.meituan.com/talk-about-reactivecocoas-cold-signal-and-hot-signal-part-2.html
“热”信号:主动的发送事件,它不关心订阅者的行为
“冷”信号:只有被订阅,才会发送事件
除了RACSubject及其子类以外,都是冷信号。这也就是美团文章中出现多次网络请求的原因,只要最初的信号被订阅一次,就会触发一次请求的原因。那么需要将冷信号转为热信号,才能避免这个问题。接下来就自己实现一下
对于普通的信号,它的
```
-(void)subscribe:(id<QHQSubscrib>)sub {
self.didSubscriber(sub);
}
```
直接调用了block,所以只要信号进行一次subscribe,那么就会掉用一下信号内部的逻辑,看到这里,应该彻底明白了美团文章中出现多次请求的原因了。
在QHQSubject中,为乐实现热信号,那么不能直接掉用,而是为QHQSubject增加一个数组以来保存所有的订阅。
```
-(void)subscribe:(id<QHQSubscrib>)sub {
[_subscribers addObject:sub];
}
```
它在sendNext的时候,将所有的订阅者的行为全部执行一遍(执行其block)
```
-(void)sendNext:(id)next {
[_subscribers enumerateObjectsUsingBlock:^(id<QHQSubscrib> QHQSubscriber, NSUInteger idx, BOOL * _Nonnull stop) {
[QHQSubscriber sendNext:next];
}];
}
```
在RAC中进行了一些封装,我这里直接用了系统提供的函数进行遍历,本质上是一样的。
这样热信号就完成了。写个测试demo试一下:
```
-(void)demoThreeHotSignal {
QHQSubject *demoPush = [[QHQSubject alloc] init];
[demoPush subscribeNext:^(id x) {
NSLog(@"%@---sub1",x);
}];
[demoPush subscribeNext:^(id x) {
NSLog(@"%@---sub2",x);
}];
[demoPush sendNext:@"demopush"];
}
```
2015-12-28 09:43:11.439 PageText[73953:5549472] demopush---sub1
2015-12-28 09:43:11.440 PageText[73953:5549472] demopush---sub2
已经达到了预期的效果,这样就解决了一个很重要的问题,服务器大哥再也不会来打你了。
ReactiveCocoa源码拆分解析(三)的更多相关文章
- ReactiveCocoa源码拆分解析(一)
(整个关于ReactiveCocoa的工程可以在https://github.com/qianhongqiang/QHQReactive下载) ReactiveCocoa的介绍我就不说了,可以自行百度 ...
- ReactiveCocoa源码拆分解析(二)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...
- ReactiveCocoa源码拆分解析(四)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上一章节简要的说明了如何实现的热信号.但是像那么写, ...
- ReactiveCocoa源码拆分解析(七)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 在这篇博客中,我将把ReactiveCocoa中的擦 ...
- ReactiveCocoa源码拆分解析(六)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...
- ReactiveCocoa源码拆分解析(五)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...
- 深入理解NIO(三)—— NIO原理及部分源码的解析
深入理解NIO(三)—— NIO原理及部分源码的解析 欢迎回到淦™的源码看爆系列 在看完前面两个系列之后,相信大家对NIO也有了一定的理解,接下来我们就来深入源码去解读它,我这里的是OpenJDK-8 ...
- 使用CEF(三)— 从CEF官方Demo源码入手解析CEF架构与CefApp、CefClient对象
在上文<使用CEF(2)- 基于VS2019编写一个简单CEF样例>中,我们介绍了如何编写一个CEF的样例,在文章中提供了一些代码清单,在这些代码清单中提到了一些CEF的定义的类,例如Ce ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
随机推荐
- AR For Unity3D之HiAR分析
前言 关于AR和Unity的基础知识,请自行前往各自的文档中心进行科普. 本文以国产的HiAR SDK为例,日后将尝试高通的vuforia SDK 我的环境 基于Hi AR1.2.0 ( hiar ...
- Ajax与json
Ajax Ajax简介 Ajax技术,从用户发送请求到获取响应,当用户界面在整个过程中不会受到干扰,而且我们可以在必要的时候只刷新页面的一小部分,而不用刷新整个页面,即"无刷新"技 ...
- 转:Eclipse Search Tips
from: https://github.com/ajermakovics/eclipse-instasearch/wiki/Eclipse-search-tips Eclipse Search T ...
- BZOJ 4423 【AMPPZ2013】 Bytehattan
Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的. 有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第 ...
- signalr推送消息
参考:Tutorial: Getting Started with SignalR 2 and MVC 5 环境:vs2013,webapi2,entity framework6.0 实现效果:当用户 ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- DNS简析
IntroductionName Server架构分层管理机制分层查询机制Name Server之间的Master-Slave架构DDNS底层协议配置文件/etc/hosts/etc/resov.co ...
- myeclipse 注释模板
选中你要加注释的方法或类,按 Alt + shift + J.
- jquey on
1.如果你的元素是用clone方法复制出来的,并且,用了on来绑定事件的话,必须在clone的后边添加true,负责你的事件不会生效. 2.必须在on $('.js-liubody').on('cli ...
- SOA总结(图片打开略慢请知晓)