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 ...
随机推荐
- Java程序设计之正则表达式
正则表达式平时在用到字符串处理的时候是比较常用的,个人觉得不需要刻意的去理解,用的话把文档拿出来查一下就好了,下面给个链接 http://www.php100.com/manual/Javascrip ...
- c#读写xml文件
using System; using System.Collections.Generic; using System.Xml; using System.Text.RegularExpressio ...
- C++的vector对象
C++的vector使用 标签(空格分隔): C++ 标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象,因为vector容纳着其 ...
- SharePoint 2013常用开发工具分享
众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协助开发人员简化开发流程.本文汇总几款SharePoint 2013开发常用开发工具,希望能够对大家有所帮助.如果您有更好的工具,没有包含在本 ...
- 系统修改利器XueTr
Windows系统修改利器XueTr 周银辉 在Windows下如果遇到某些进程弄死结束不了,某些文件弄死删不掉,拷贝不出来 (可能是因为你没有管理员权限,可能是因为人家是病毒,可能是系统保护文件,可 ...
- 解决Scala Play框架在Git Bash运行的异常:Could not find configuration file ../framework/sbt/sbt.boot.properties
Git Bash+ConEmu可以模拟Linux强大的命令行.不过在结合Scala和Play时,需要注意如下事项: 1. Scala的安装在64位操作系统下,默认会放在“C:\Program File ...
- 有利于SEO的DIV+CSS的命名规则
搜索引擎优化(seo)有很多工作要做,其中对代码的优化是一个很关键的步骤.为了更加符合SEO的规范,下面是目前流行的CSS+DIV的命名规则: 页头:header登录条:loginBar标志:logo ...
- EF7 使用 K EF 异常
在使用EF 7 Code first功能时. k ef 报如下错误: 解决办法: 在project.json 同级目录下新建k.cmd,内容如下: "%~dp0approot\runtime ...
- C#中根据变量获取变量名字符串
/// <summary> /// 获取当前变量的变量名 字符串 /// 调用:GetVarName(p=>test.str1); 返回 " ...
- Matplotlib 学习笔记
注:该文是上了开智学堂数据科学基础班的课后做的笔记,主讲人是肖凯老师. 数据绘图 数据可视化的原则 为什么要做数据可视化? 为什么要做数据可视化?因为可视化后获取信息的效率高.为什么可视化后获取信息的 ...