iOS RAC - RACSubject、RACReplaySubject

文章系列
《RACSignal 》
《RACDisposable》
《RACSubject造虎、RACReplaySubject》
《iOS RAC - 基本用法》
《iOS RAC - 定時器》
《iOS RAC - RACMulticastConnection》
《iOS RAC - RACCommand》
《iOS RAC - 核心方法bind》
《iOS RAC - 集合RACTuple惦费、RACSequence》
《iOS RAC - rac_leftSelector》
《iOS RAC - 映射》
《iOS RAC - 過濾》
《iOS RAC - 登錄頁面司志,MVVM》

之前有提到過RACSignal是不具備發(fā)送信號的能力的,但是RACSubject這個類就可以做到訂閱/發(fā)送為一體松嘶。
之前還提到過RAC三部曲艘狭,在RACSuject中同樣適用。

<br / >

然后我們先創(chuàng)建一個簡單的代碼段翠订,然后接著分析分析巢音。
    //1創(chuàng)建信號,
    RACSubject * subject = [RACSubject subject];
    
    //2訂閱信號 
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
   
    //3發(fā)送數(shù)據(jù)
    [subject sendNext:@"發(fā)送數(shù)據(jù)"];

<br />

  • 1. 先看看創(chuàng)建信號會干啥吧
sbuject

從上圖中可以很直觀的看到 調(diào)用subject方法內(nèi)部事創(chuàng)建了一個_disposable取消信號和一個數(shù)組_subscribers尽超,這個數(shù)組從命名上就可以看出來這個數(shù)組事官撼,用來保存訂閱者。

<br />

  • 2. 然后是訂閱信號
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
    NSCParameterAssert(nextBlock != NULL);
    
    RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
    return [self subscribe:o];
}

這里很簡單似谁,創(chuàng)建一個訂閱者歧寺,然后調(diào)用 self subscribe:o]方法燥狰,細心的你可能還記得在RACSignal中也調(diào)用了這個方法,但是需要注意的是這兩個方法并不是一個方法斜筐,內(nèi)部實現(xiàn)不一樣龙致。

選中這個方法進去


如何進去

內(nèi)部實現(xiàn)代碼:


內(nèi)部實現(xiàn)

通過上面的代碼截圖我們得知了,在訂閱的時候會把訂閱者會把訂閱者保存到一開創(chuàng)建RACSubject中的數(shù)組_subscribers中去顷链。

<br />

  • 3. 最后是發(fā)布信息
[subject sendNext:@"發(fā)送數(shù)據(jù)"];

點進去繼續(xù)看看內(nèi)部實現(xiàn)吧

發(fā)布信息

<br />

  • 總結(jié):

1目代、創(chuàng)建的subject的是內(nèi)部會創(chuàng)建一個數(shù)組_subscribers用來保存所有的訂閱者
2、訂閱信息的時候會創(chuàng)建訂閱者嗤练,并且保存到數(shù)組中
3榛了、遍歷subject中_subscribers中的訂閱者,依次發(fā)送信息

  • 所以對于RACSignal不同的地方是:他可以被訂閱多次煞抬,并且只能是先訂閱后發(fā)布霜大。

驗證驗證:

Paste_Image.png

<br />
從上面的代碼中可以明確的看到叠穆,第一次發(fā)送的字符串是沒有收到的梗搅,所以證明了RACSubject只能訂閱之后,發(fā)送數(shù)據(jù)才收到
然后我們訂閱多次信號福稳,然后發(fā)送數(shù)據(jù)残拐,我們可以看到收到了兩次數(shù)據(jù)途茫。
??所以可以得到上面的總結(jié)是沒有錯誤的。

<br />

最后還有一個小問題溪食,那就是如果我非要先發(fā)送在訂閱囊卜,并且也要能收到怎么處理呢?

當然是有辦法的啦错沃,主角來了栅组,自帶(賭神)聲音。枢析。笑窜。。

RACReplaySubject登疗,他繼承RACSubject排截,他的目的就是為例解決上面必須先訂閱后發(fā)送的問題。

運行截圖

一樣的三行代碼辐益,運行出來的結(jié)果遇上面的不一致断傲,難道不想看看嘛?哈哈智政,我反正是有興趣了认罩,ok,來分析吧续捂。

<br />

  • 1 創(chuàng)建信號

還記得RACSubject就是在init中做了初始化垦垂,不記得就到文章開頭開開宦搬,所以我們直接看他對init做了啥處理吧

init

<br />

  • 2 發(fā)送信號

- (void)sendNext:(id)value {
    @synchronized (self) {
        [self.valuesReceived addObject:value ?: RACTupleNil.tupleNil];
        [super sendNext:value];
        
        if (self.capacity != RACReplaySubjectUnlimitedCapacity && self.valuesReceived.count > self.capacity) {
            [self.valuesReceived removeObjectsInRange:NSMakeRange(0, self.valuesReceived.count - self.capacity)];
        }
    }
}

可以看到代碼中在發(fā)送之前做了一件事情,把要發(fā)送的數(shù)據(jù)保存到數(shù)組中劫拗,然后調(diào)用父類的發(fā)送方法间校,發(fā)送玩了看發(fā)送成功了沒,成功了就刪除數(shù)據(jù)页慷,避免一個數(shù)據(jù)多次發(fā)送憔足。

  • 3 訂閱信號

訂閱信號

總結(jié):

1、創(chuàng)建的時候會在父類的基礎之上多做一步酒繁,創(chuàng)建一個數(shù)組用來保存發(fā)送的數(shù)據(jù)
2滓彰、發(fā)送數(shù)據(jù),但是此時發(fā)送會失敗啊州袒,為什么揭绑?因為沒有人訂閱啊,我發(fā)給誰啊郎哭。
3他匪、訂閱信號,先遍歷一次保存數(shù)據(jù)的數(shù)組彰居,如果有就執(zhí)行 2 诚纸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撰筷,一起剝皮案震驚了整個濱河市陈惰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毕籽,老刑警劉巖抬闯,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異关筒,居然都是意外死亡溶握,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門蒸播,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睡榆,“玉大人,你說我怎么就攤上這事袍榆≌陀欤” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵包雀,是天一觀的道長宿崭。 經(jīng)常有香客問我,道長才写,這世上最難降的妖魔是什么葡兑? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任奖蔓,我火速辦了婚禮,結(jié)果婚禮上讹堤,老公的妹妹穿的比我還像新娘吆鹤。我一直安慰自己,他們只是感情好蜕劝,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布檀头。 她就那樣靜靜地躺著,像睡著了一般岖沛。 火紅的嫁衣襯著肌膚如雪暑始。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天婴削,我揣著相機與錄音廊镜,去河邊找鬼。 笑死唉俗,一個胖子當著我的面吹牛嗤朴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虫溜,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼雹姊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衡楞?” 一聲冷哼從身側(cè)響起吱雏,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘾境,沒想到半個月后歧杏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡迷守,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年犬绒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兑凿。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡凯力,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出礼华,到底是詐尸還是另有隱情咐鹤,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布卓嫂,位于F島的核電站慷暂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜行瑞,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一奸腺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧血久,春花似錦突照、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筑舅,卻和暖如春座慰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翠拣。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工版仔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人误墓。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓蛮粮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谜慌。 傳聞我的和親對象是個殘疾皇子然想,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容