博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ReactiveCocoa源码拆分解析(三)
阅读量:7104 次
发布时间:2019-06-28

本文共 1465 字,大约阅读时间需要 4 分钟。

(整个关于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

 

已经达到了预期的效果,这样就解决了一个很重要的问题,服务器大哥再也不会来打你了。

转载于:https://www.cnblogs.com/qianhongqiang/p/5081607.html

你可能感兴趣的文章
CentOS 7.6最小化安装(系统盘和数据盘分离安装)
查看>>
从零开始编写自己的C#框架(8)——后台管理系统功能设计
查看>>
C#编程(三十一)----------泛型总结
查看>>
入门:在ubuntu中安装Nessus漏洞扫描器
查看>>
TT模板的作用及使用
查看>>
Android 内核--Binder架构分析
查看>>
CSS background-attachment属性三种值
查看>>
Appserv配置多站点访问
查看>>
java 工具中json的使用
查看>>
javaScript有哪些数据类型
查看>>
ORACLE取周、月、季、年的開始时间和结束时间
查看>>
android动画介绍之 自己定义Animation动画实现qq抖一抖效果
查看>>
LeetCode Reverse Linked List
查看>>
【一】Spark基础
查看>>
胖五加油!作为程序员_该如何去挽救一个失败的项目?
查看>>
更新Debian软件源
查看>>
转半角的函数(DBC case)
查看>>
loj10241 取石子游戏1
查看>>
ZROI2018普转提day2t3
查看>>
学习JDK1.8集合源码之--HashSet
查看>>