(整个关于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. HDU 1524 A Chess Game【SG函数】

    题意:一个N个点的拓扑图,有M个棋子,两个人轮流操作,每次操作可以把一个点的棋子移动到它的一个后继点上(每个点可以放多个棋子),直到不能操作,问先手是否赢. 思路:DFS求每个点的SG值,没有后继的点 ...

  2. CH Round #72 奇数码问题[逆序对 观察]

    描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...

  3. Python的hasattr() getattr() setattr() 函数使用方法详解

    hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False.需要注意的是name要用括号括起来 1 ...

  4. Unity3D脚本行尾(Line Endings)

    行尾不一致(inconsistent line endings ) 开发环境 有时候编辑Unity的脚本文件,代码diff之后,或者从svn更新文件之后,Unity中会出现行尾不一致的信息. 我的开发 ...

  5. sqlServer数据库实现不同库之间表迁移

    (1) (2) 点击开始便进行数据库到库的迁移.

  6. SQL Left Join, Right Join, Inner Join, and Natural Join 各种Join小结

    在SQL语言中,存在着各种Join,有Left Join, Right Join, Inner Join, and Natural Join等,对于初学者来说肯定一头雾水,都是神马跟神马啊,它们之间到 ...

  7. Java使用代理服务器

    HTTP协议是基于TCP协议的,TCP协议在Java中的体现就是套接字.在了解HTTP协议的基础上,完全可以通过TCP来实现一套HTTP库,这个库可以发起网络请求和接受网络请求.只要能用URLConn ...

  8. jQuery笔记总结

    来源于:http://blog.poetries.top/2016/10/20/review-jQuery/ http://www.jianshu.com/p/f8e3936b34c9 首先,来了解一 ...

  9. MyBatis的foreach标签与SUM函数同时使用

    最近在项目中遇到一个,需要根据传入的存有id的list,计算值,再起别名 <if test="channelList != null and channelList.size()> ...

  10. PRINCE2第二个原则

    PRINCE2要求项目团队吸取以前的经验教训,在项目生命周期中发现.记录和应对.吸取经验教训,应该记录在整个生命周期中,项目准备期应该回顾以往类似项目,看看是否有经验教训可以应用,如果项目是第一次做, ...