(整个关于ReactiveCocoa的代码工程能够在https://github.com/qianhongqiang/QHQReactive下载)html
这一章节主要讨论信号的“冷”与“热”react
在RAC的世界里,信号是有“冷”(被动passive)与“热”(主动active)之分的。并且一不当心,这就可能成为了严重的问题,具体能够参见案例http://tech.meituan.com/talk-about-reactivecocoas-cold-signal-and-hot-signal-part-2.htmlgit
“热”信号:主动的发送事件,它不关心订阅者的行为github
“冷”信号:只有被订阅,才会发送事件数组
除了RACSubject及其子类之外,都是冷信号。这也就是美团文章中出现屡次网络请求的缘由,只要最初的信号被订阅一次,就会触发一次请求的缘由。那么须要将冷信号转为热信号,才能避免这个问题。接下来就本身实现一下服务器
对于普通的信号,它的网络
```函数
-(void)subscribe:(id<QHQSubscrib>)sub {测试
self.didSubscriber(sub);htm
}
```
直接调用了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
已经达到了预期的效果,这样就解决了一个很重要的问题,服务器大哥不再会来打你了。