日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

细说ReactiveCocoa的冷信号与热信号(一)

發布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 细说ReactiveCocoa的冷信号与热信号(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

ReactiveCocoa(簡稱RAC)是最初由GitHub團隊開發的一套基于Cocoa的FRP框架。FRP即Functional Reactive Programming(函數式響應式編程),其優點是用隨時間改變的函數表示用戶輸入,這樣就不需要可變狀態了。我們之前的文章“RACSignal的Subscription深入分析”里曾經詳細講解過RAC核心概念之一RACSignal的實現原理。在美團客戶端中,我們大量使用了這個框架。冷信號與熱信號的概念很容易混淆并造成一定的問題。鑒于這個問題具有一定普遍性,我將用一系列文章講解RAC中冷信號與熱信號的相關知識點,希望可以加深大家的理解。本文是系列文章的第一篇。

p.s. 以下代碼和示例基于ReactiveCocoa v2.5。

什么是冷信號與熱信號

冷熱信號的概念源于.NET框架Reactive Extensions(RX)中的Hot Observable和Cold Observable,兩者的區別是:

  • Hot Observable是主動的,盡管你并沒有訂閱事件,但是它會時刻推送,就像鼠標移動;而Cold Observable是被動的,只有當你訂閱的時候,它才會發布消息。

  • Hot Observable可以有多個訂閱者,是一對多,集合可以與訂閱者共享信息;而Cold Observable只能一對一,當有不同的訂閱者,消息是重新完整發送。

  • 這里面的Observables可以理解為RACSignal。為了加深理解,我們來看這樣的幾組代碼:

    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {[subscriber sendNext:@1];[subscriber sendNext:@2];[subscriber sendNext:@3];[subscriber sendCompleted];return nil;}];NSLog(@"Signal was created.");[[RACScheduler mainThreadScheduler] afterDelay:0.1 schedule:^{[signal subscribeNext:^(id x) {NSLog(@"Subscriber 1 recveive: %@", x);}];}];[[RACScheduler mainThreadScheduler] afterDelay:1 schedule:^{[signal subscribeNext:^(id x) {NSLog(@"Subscriber 2 recveive: %@", x);}];}];

    以上簡單地創建了一個信號,并且依次發送@1,@2,@3作為值。下面分別有兩個訂閱者在不同的時間段進行了訂閱,運行的結果如下:

    2015-08-11 18:33:21.681 RACDemos[6505:1125196] Signal was created. 2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 1 2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 2 2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 3 2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 1 2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 2 2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 3

    我們可以看到,信號在18:33:21.681時被創建,18:33:21.793依次接到1、2、3三個值,而在18:33:22.683再依次接到1、2、3三個值。說明了變量名為signal的這個信號,在兩個不同時間段的訂閱過程中,分別完整地發送了所有的消息。

    我們再對這段代碼進行一個小的改動:

    RACMulticastConnection *connection = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {[[RACScheduler mainThreadScheduler] afterDelay:1 schedule:^{[subscriber sendNext:@1];}];[[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{[subscriber sendNext:@2];}];[[RACScheduler mainThreadScheduler] afterDelay:3 schedule:^{[subscriber sendNext:@3];}];[[RACScheduler mainThreadScheduler] afterDelay:4 schedule:^{[subscriber sendCompleted];}];return nil;}] publish];[connection connect];RACSignal *signal = connection.signal;NSLog(@"Signal was created.");[[RACScheduler mainThreadScheduler] afterDelay:1.1 schedule:^{[signal subscribeNext:^(id x) {NSLog(@"Subscriber 1 recveive: %@", x);}];}];[[RACScheduler mainThreadScheduler] afterDelay:2.1 schedule:^{[signal subscribeNext:^(id x) {NSLog(@"Subscriber 2 recveive: %@", x);}];}];

    稍微有些復雜,我們來一一分析:

    • 創建了一個信號,在1秒、2秒、3秒分別發送1、2、3這三個值,4秒發送結束信號。
    • 對這個信號調用publish方法得到一個RACMulticastConnection。
    • 讓connection進行連接操作。
    • 獲得connection的信號。
    • 分別在1.1秒和2.1秒訂閱獲得的信號。

    拋開RACMulticastConnection是個什么東東,我們先來看下結果:

    2015-08-12 11:07:49.943 RACDemos[9418:1186344] Signal was created. 2015-08-12 11:07:52.088 RACDemos[9418:1186344] Subscriber 1 recveive: 2 2015-08-12 11:07:53.044 RACDemos[9418:1186344] Subscriber 1 recveive: 3 2015-08-12 11:07:53.044 RACDemos[9418:1186344] Subscriber 2 recveive: 3

    首先告訴大家- [RACSignal publish]、- [RACMulticastConnection connect]、- [RACMulticastConnection signal]這幾個操作生成了一個熱信號。 我們再來關注下輸出結果的一些細節:

    • 信號在11:07:49.943被創建
    • 11:07:52.088時訂閱者1才收到2這個值,說明1這個值沒有接收到,時間間隔是2秒多
    • 11:07:53.044時訂閱者1和訂閱者2同時收到3這個值,時間間隔是3秒多

    參考一開始的Hot Observables的論述和兩段小程序的輸出結果,我們可以確定冷熱信號的如下特點:

  • 熱信號是主動的,即使你沒有訂閱事件,它仍然會時刻推送。如第二個例子,信號在50秒被創建,51秒的時候1這個值就推送出來了,但是當時還沒有訂閱者。而冷信號是被動的,只有當你訂閱的時候,它才會發送消息。如第一個例子。
  • 熱信號可以有多個訂閱者,是一對多,信號可以與訂閱者共享信息。如第二個例子,訂閱者1和訂閱者2是共享的,他們都能在同一時間接收到3這個值。而冷信號只能一對一,當有不同的訂閱者,消息會從新完整發送。如第一個例子,我們可以觀察到兩個訂閱者沒有聯系,都是基于各自的訂閱時間開始接收消息的。
  • 好的,至此我們知道了什么是冷信號與熱信號,了解了它們的特點。下一篇文章我們來看看為什么要區分冷信號與熱信號。

    總結

    以上是生活随笔為你收集整理的细说ReactiveCocoa的冷信号与热信号(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。