ReactiveObjC源碼分析

基于信號的響應(yīng)式編程框架搁宾。

RACSignal
信號基類RACSignal(繼承自RACStream),調(diào)用createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe方法會生成冷信號祥楣,并保存didSubscribe(此時并不會執(zhí)行didSubscribe)。
冷信號只有被訂閱時,才會變成熱信號茅诱。通過調(diào)用RACSignal的subscribeNext:方法金句,會生成一個RACSubscriber訂閱者檩赢, 之后調(diào)用subscribe: 方法(實際是調(diào)用RACDynamicSignal的subscribe:方法),在subscribe: 內(nèi)部會調(diào)用didSubscribe违寞。
常用的信號:RACDynamicSignal事件流信號贞瞒、RACErrorSignal錯誤信號、RACEmptySignal空信號(不觸發(fā)訂閱事件)趁曼。

RACSubscriber
訂閱者军浆,sendNext觸發(fā)subcribeNext,sendCompleted觸發(fā)subscribeCompleted挡闰,sendError觸發(fā)subscribeError瘾敢。sendNext后如果要移除信號,防止資源占用導(dǎo)致事件流堵塞尿这,需調(diào)用sendCompleted簇抵。
用流水線的角度來看,RACSignal相當于管線射众,RACSubscriber相當于工人碟摆,工人對傳過來的信號進行加工處理,觸發(fā)各種事件叨橱。
流程: createSianal,生成信號同時保存didSubscribe—>subscribeNext生成訂閱者典蜕,并調(diào)用—>subscribe—>didSubscribe—>合適時機調(diào)用sendNext等方法—>觸發(fā)subscribeNext等block執(zhí)行塊断盛。

RACSubject
繼承自RACSignal,熱信號愉舔。RACSubject不止有一個訂閱者钢猛,其內(nèi)部維護一個訂閱者數(shù)組。同時其能自發(fā)調(diào)用sendNext方法轩缤。
流程:sendNext—>subscibeNext

RACCommand
比較上層的工人命迈,內(nèi)部維護了多個RACSubject。
executionSignals 執(zhí)行內(nèi)部事務(wù)調(diào)用sendNext火的、sendError的響應(yīng)信號壶愤。
errors 執(zhí)行內(nèi)部事務(wù)調(diào)用sendError的響應(yīng)信號。
等等馏鹤。
以UIButton+RACCommandSupport的流程為例:
RACCommand的initWithSignalBlock生成一個rac_command,并保存signalBlock征椒,把rac_command傳給button。
button點擊—>rac_command.execute—>調(diào)用signalBlock生成信號—>signalBlock內(nèi)部的didSubscribe—>subscribe.sendNext湃累、sendError—>觸發(fā)executionSignals.subscribeNext勃救、errors.subscribeNext。

static NSInteger iii = 0;
button.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
    NSLog(@"button pressed");
    return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        if (iii % 2== 0) {
            [subscriber sendNext:input];
            [subscriber sendCompleted];
        } else {
            [subscriber sendError:nil];
        }
        iii++;
        return nil;
    }];
}];

[button.rac_command.executionSignals subscribeNext:^(RACSignal<id> * _Nullable x) {
    RACSignal *s = (RACSignal *)x;
    [s subscribeNext:^(id  _Nullable x) {
        NSLog(@"執(zhí)行事件");
    }];
}];

[button.rac_command.errors subscribeNext:^(NSError * _Nullable x) {
    NSLog(@"錯誤發(fā)生");
}];

bind
map治力、flattenMap等方法都是基于bind剪芥,而bind的實現(xiàn)過程也能充分體現(xiàn)ReactiveObjC基于信號通信的思想。
信號1調(diào)用bind:bindBlcok?琴许,會返回信號2,信號2的didSubscribe?調(diào)用self的subscribeNext:error:completed方法(即信號1的subscribeNext:error:completed?)溉躲,在subscribeNext中用bindBlock生成信號3?榜田,并調(diào)用信號3的subscribeNext?,subscribeNext的執(zhí)行塊會調(diào)用信號2的subscriber.sendNext?, 從而觸發(fā)信號2的subscribeNext執(zhí)行塊?锻梳。
這樣每次信號1觸發(fā)時箭券,就會觸發(fā)信號2,從而實現(xiàn)了新信號綁定舊信號的功能疑枯。
流程:信號1的訂閱者subscriber1.sendNext—>信號1的subscribeNext block(?處)—>生成信號3—>信號3的subscribeNext block(?處)—>信號2的subscriber.sendNext(?處)—>信號2的subscribeNext block辩块。
從而實現(xiàn)了信號1觸發(fā)時,信號2的subscribeNext block能被執(zhí)行荆永。

常用的宏
RAC(id, property)
RACObserve(id, property)等

參考源碼:https://github.com/ReactiveCocoa/ReactiveObjC

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末废亭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子具钥,更是在濱河造成了極大的恐慌豆村,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骂删,死亡現(xiàn)場離奇詭異掌动,居然都是意外死亡四啰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門粗恢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柑晒,“玉大人,你說我怎么就攤上這事眷射〕自蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵凭迹,是天一觀的道長罚屋。 經(jīng)常有香客問我,道長嗅绸,這世上最難降的妖魔是什么脾猛? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鱼鸠,結(jié)果婚禮上猛拴,老公的妹妹穿的比我還像新娘。我一直安慰自己蚀狰,他們只是感情好愉昆,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著麻蹋,像睡著了一般跛溉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扮授,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天芳室,我揣著相機與錄音,去河邊找鬼刹勃。 笑死堪侯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的荔仁。 我是一名探鬼主播伍宦,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乏梁!你這毒婦竟也來了次洼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遇骑,失蹤者是張志新(化名)和其女友劉穎滓玖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體质蕉,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡势篡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年翩肌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禁悠。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡念祭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碍侦,到底是詐尸還是另有隱情粱坤,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布瓷产,位于F島的核電站站玄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏濒旦。R本人自食惡果不足惜株旷,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尔邓。 院中可真熱鬧晾剖,春花似錦、人聲如沸梯嗽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灯节。三九已至循头,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炎疆,已是汗流浹背卡骂。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留磷雇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓躏救,卻偏偏與公主長得像唯笙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盒使,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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

  • 前幾個月一直在學(xué)習(xí)RxSwift崩掘,確實相當酷的一個開源庫,受益匪淺少办。在未來學(xué)習(xí)swift版本(ReactiveSw...
    王琦_7a23閱讀 5,287評論 3 20
  • RAC源碼分析 簡要而言:RAC事實上就是對block進行copy和封裝苞慢,在需要的時候進行調(diào)用的時候再拿出來調(diào)用。...
    BangRaJun閱讀 486評論 0 0
  • RAC源碼分析 簡要而言:RAC事實上就是對block進行copy和封裝英妓,在需要的時候進行調(diào)用的時候再拿出來調(diào)用挽放。...
    BangRaJun閱讀 562評論 0 1
  • ReactiveCocoa(其簡稱為 RAC)是Github開源的一個應(yīng)用于 iOS 和 OS X 開發(fā)的框架绍赛。R...
    th先生閱讀 323評論 1 3
  • 參考:http://www.reibang.com/p/4fee21fb05b3 我們在領(lǐng)略到RAC的強大和不可...
    wenjunyeah閱讀 767評論 1 2