(整個關於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
已經達到了預期的效果,這樣就解決了一個很重要的問題,服務器大哥不再會來打你了。