(整个关于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源码拆分解析(三)的更多相关文章

  1. ReactiveCocoa源码拆分解析(一)

    (整个关于ReactiveCocoa的工程可以在https://github.com/qianhongqiang/QHQReactive下载) ReactiveCocoa的介绍我就不说了,可以自行百度 ...

  2. ReactiveCocoa源码拆分解析(二)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...

  3. ReactiveCocoa源码拆分解析(四)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上一章节简要的说明了如何实现的热信号.但是像那么写, ...

  4. ReactiveCocoa源码拆分解析(七)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 在这篇博客中,我将把ReactiveCocoa中的擦 ...

  5. ReactiveCocoa源码拆分解析(六)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...

  6. ReactiveCocoa源码拆分解析(五)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...

  7. 深入理解NIO(三)—— NIO原理及部分源码的解析

    深入理解NIO(三)—— NIO原理及部分源码的解析 欢迎回到淦™的源码看爆系列 在看完前面两个系列之后,相信大家对NIO也有了一定的理解,接下来我们就来深入源码去解读它,我这里的是OpenJDK-8 ...

  8. 使用CEF(三)— 从CEF官方Demo源码入手解析CEF架构与CefApp、CefClient对象

    在上文<使用CEF(2)- 基于VS2019编写一个简单CEF样例>中,我们介绍了如何编写一个CEF的样例,在文章中提供了一些代码清单,在这些代码清单中提到了一些CEF的定义的类,例如Ce ...

  9. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

随机推荐

  1. 嵌入式Linux驱动学习之路(十五)按键驱动-定时器防抖

    在之前的定时器驱动程序中,我们发现在连续按下按键的时候,正常情况下应该是一次按下对应一次松开.而程序有时候会显示是两次按下,一次松开.这个问题是因为在按下的时候,因为是机械按键,所以电压信号会产生一定 ...

  2. SQL/LINQ/Lamda 写法[转发]

    SQL LINQ Lambda SELECT * FROM HumanResources.Employee from e in Employees select e Employees   .Sele ...

  3. 3942: [Usaco2015 Feb]Censoring [KMP]

    3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 375  Solved: 206[Subm ...

  4. 为什么 Java 8 中不再需要 StringBuilder 拼接字符串

    为什么 Java 8 中不再需要 StringBuilder 拼接字符串 来源:codeceo 发布时间:2016-12-27 阅读次数:427 0   在Java开发者中,字符串的拼接占用资源高往往 ...

  5. Writing Clean Code 读后感

    最近花了一些时间看了这本书,书名是 <Writing Clean Code ── Microsoft Techniques for Developing Bug-free C Programs& ...

  6. Editplus常用快捷键

    EditPlus 快捷键的使用 如果一个来你们公司面试程序员,连Ctrl + C 和Ctrl + V 都不用,而是使用“选中文本”→ 鼠标右键 → [复制],然后再鼠标右键→ [粘贴].你会不会录用他 ...

  7. nodejs+express+mysql 增删改查

    之前,一直使用的是nodejs+thinkjs来完成自己所需的项目需求,而对于nodejs中另外一中应用框架express却了解的少之又少,这两天就简单的了解了一下如何使用express来做一些数据库 ...

  8. webpack ---loader,plugin下载命令

    css-loader:  cnpm install style-loader css-loader url-loader babel-loader sass-loader file-loader -- ...

  9. 无法加载父级样式或设置IIS的asp站点启用父路径

    打开IIS 1.单击站点,在"IIS"区域中找到ASP图标,双击. 2.找到"启用父路径"项目,将对应的值设置为"TRUE"即可.   顶

  10. HTML5利用link标签的rel=import引入html页面

    如果是以前,我们可以使用iframe去引入,现在可以是这样的形式:<link rel="import" href="a.html" id="tm ...