ReactiveCocoa源碼拆分解析(三)

(整個關於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

 

已經達到了預期的效果,這樣就解決了一個很重要的問題,服務器大哥不再會來打你了。

相關文章
相關標籤/搜索