RAC常用方法replay携龟、replayLast兔跌、replayLazily區(qū)別詳解-進(jìn)階篇

ReactCocoa 版本號:V2.5
Language: ObjectC
XCode 版本號: V9.4
Note: 閱讀本文章假設(shè)您已經(jīng)有了一定的ReactCocoa基礎(chǔ)知識(shí)

一、RACSingal (信號)
1.每次訂閱信號峡蟋,都會(huì)導(dǎo)致信號的訂閱代碼被調(diào)用坟桅,且參數(shù)subscriber的值每次都不一樣。
2.訂閱者只能收到訂閱后發(fā)送的所有消息蕊蝗,無法收到之前發(fā)送的歷史消息仅乓。

RACSignal *sig = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    NSLog(@"我被訂閱了,%@", subscriber); //每次有人訂閱都會(huì)執(zhí)行這段Block, subscriber每次值不一樣
 
    [subscriber sendNext:@"aaa"];  //發(fā)送消息:aaa
    return nil;
}];

NSLog(@"11馬上訂閱信號"); //第一步打印
[sig subscribeNext:^(id x) { //一旦被訂閱上面的訂閱代碼被執(zhí)行
    NSLog(@"11接收到:%@",x); //上面的訂閱代碼里發(fā)送了消息aaa,這里能收到
}];

NSLog(@"22馬上訂閱信號");
[sig subscribeNext:^(id x) { //又被訂閱一次蓬戚,導(dǎo)致上面的訂閱代碼再次執(zhí)行
    NSLog(@"222接收到:%@",x);  //上面訂閱代碼里發(fā)送了消息aaa方灾,這里能收到,上面的訂閱者11也能收到
}];

對比一下控制臺(tái)打印結(jié)果如下圖:


1.png

把上面代碼進(jìn)行簡單修改一下

__block id<RACSubscriber> s = nil;
RACSignal *sig = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    NSLog(@"我被訂閱了,%@", subscriber); //每次有人訂閱都會(huì)執(zhí)行這段Block, subscriber每次值不一樣
    s =  subscriber; //保存到外部變量碌更,讓Block外面去發(fā)送消息
    return nil;
}];

NSLog(@"馬上發(fā)消息aaa");
[s  sendNext:@"aaa"];  //sig信號此時(shí)還沒有被訂閱裕偿,上面的訂閱代碼沒有執(zhí)行,s此時(shí)值為nil痛单,發(fā)送失敗

NSLog(@"11馬上訂閱信號"); 
[sig subscribeNext:^(id x) { //一旦被訂閱上面的訂閱代碼被執(zhí)行嘿棘,s變量不為空
    NSLog(@"11接收到:%@",x); //由于上面的訂閱代碼里并沒有發(fā)送消息,所以這里收不到任何消息
}];

NSLog(@"馬上發(fā)消息bbb");
[s  sendNext:@"bbb"];  //sig信號上面已經(jīng)被訂閱了旭绒,且s保存了上一次值鸟妙,發(fā)送成功,上面訂閱者11能收到消息

NSLog(@"22馬上訂閱信號");
[sig subscribeNext:^(id x) { //又被訂閱一次挥吵,導(dǎo)致上面的訂閱代碼再次執(zhí)行重父,s變量變成新的值
    NSLog(@"222接收到:%@",x);  //由于s變量更新后并沒有發(fā)送消息,所以這里也接收不到消息
}];

NSLog(@"馬上發(fā)消息ccc");
[s  sendNext:@"ccc"];  //注意忽匈,s變量是最后一次訂閱后的值房午,所以此次發(fā)送的消息,只有最后一個(gè)訂閱者能接收到

代碼執(zhí)行結(jié)果如下:

44.png

二丹允、replay :
1.調(diào)用replay郭厌,會(huì)導(dǎo)致源信號的訂閱代碼先被調(diào)用
2.信號多次被訂閱不會(huì)重復(fù)執(zhí)行源信號的訂閱代碼
3.訂閱者能收到所有歷史已經(jīng)發(fā)送的、未來發(fā)送的所有消息雕蔽。

__block id<RACSubscriber> s = nil;
RACSignal *sig = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    NSLog(@"開始發(fā)送");     //1.第一步執(zhí)行折柠。replay內(nèi)部會(huì)先訂閱此信號導(dǎo)致此Block會(huì)被調(diào)用
    s = subscriber;       //將發(fā)送者保存到外部變量,因?yàn)閎lock外部需要發(fā)送信號
    [s sendNext:@"aaa"];  //注意批狐,此時(shí)此刻信號還沒有訂閱者
    return nil;
}] replay];

NSLog(@"馬上發(fā)送消息bbb");//2.第二步打印 
[s sendNext:@"bbb"];  //此時(shí)此刻扇售,信號還是沒有訂閱者

[sig subscribeNext:^(id x) {//訂閱不會(huì)導(dǎo)致信號的訂閱代碼被調(diào)用
    NSLog(@"11接收到:%@",x); //3.第三步執(zhí)行,神奇的事情發(fā)生了,這里依然能接收到前面已經(jīng)發(fā)送出去的消息aaa承冰、bbb
}];

[s sendNext:@"ccc"]; //繼續(xù)發(fā)送嘱根,會(huì)導(dǎo)致前面的訂閱者收到消息:ccc
[s sendNext:@"ddd"]; //繼續(xù)發(fā)送,會(huì)導(dǎo)致前面的訂閱者收到消息:ddd
[s sendNext:@"eeee"];//繼續(xù)發(fā)送巷懈,會(huì)導(dǎo)致前面的訂閱者收到消息:eeee

[sig subscribeNext:^(id x) {
    NSLog(@"222接收到:%@",x);  //前面已經(jīng)發(fā)送出去的消息都能收到:aaa该抒、bbb、ccc顶燕、ddd凑保、eeee
}];

對比一下控制臺(tái)打印結(jié)果如下圖:

---.png

三、replayLast :
1.調(diào)用replayLast涌攻,會(huì)導(dǎo)致源信號的訂閱代碼先被調(diào)用(與replay相同)
2.信號多次被訂閱不會(huì)重復(fù)執(zhí)行源信號的訂閱代碼(與replay相同)
3.訂閱者只能收到歷史已經(jīng)發(fā)送的最近一條信息欧引、未來發(fā)送的所有消息。(與replay唯一不同)

__block id<RACSubscriber> s = nil;
RACSignal *sig = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    NSLog(@"開始發(fā)送");     //1.第一步執(zhí)行恳谎。replayLast內(nèi)部會(huì)先訂閱此信號導(dǎo)致此Block會(huì)被調(diào)用
    s = subscriber;       //將發(fā)送者保存到外部變量芝此,因?yàn)閎lock外部需要發(fā)送信號
    [s sendNext:@"aaa"];  //注意,此時(shí)此刻信號還沒有訂閱者
    return nil;
}] replayLast];

[s sendNext:@"bbb"];  //此時(shí)此刻因痛,信號還是沒有訂閱者

[sig subscribeNext:^(id x) {
    NSLog(@"11接收到:%@",x); //2.第二部執(zhí)行婚苹,這里只能收到前面歷史消息中最近的一條:bbb,無法收到aaa消息。
}];

[s sendNext:@"ccc"]; //繼續(xù)發(fā)送鸵膏,會(huì)導(dǎo)致前面的訂閱者收到消息:ccc
[s sendNext:@"ddd"]; //繼續(xù)發(fā)送膊升,會(huì)導(dǎo)致前面的訂閱者收到消息:ddd
[s sendNext:@"eeee"];//繼續(xù)發(fā)送,會(huì)導(dǎo)致前面的訂閱者收到消息:eeee

[sig subscribeNext:^(id x) {//再次訂閱不會(huì)導(dǎo)致訂閱代碼再次執(zhí)行
    NSLog(@"222接收到:%@",x);  //只能收到前面的最近一條消息:eeee
}];

[s sendNext:@"ffff"];//繼續(xù)發(fā)送谭企,會(huì)導(dǎo)致前面的兩個(gè)訂閱者都收到消息:ffff

控制臺(tái)打印結(jié)果如下圖:


0.png

四廓译、replayLazily :
1.調(diào)用replayLazily,會(huì)導(dǎo)致源信號的訂閱代碼只在信號首次被訂閱時(shí)調(diào)用(與replay唯一不同)
2.信號多次被訂閱不會(huì)重復(fù)執(zhí)行源信號的訂閱代碼(與replay相同)
3.訂閱者能收到所有歷史已經(jīng)發(fā)送的债查、未來發(fā)送的所有消息非区。(與replay相同)

__block id<RACSubscriber> s = nil;
RACSignal *sig = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    NSLog(@"開始發(fā)送");     //首次訂閱此信號導(dǎo)致此Block會(huì)被調(diào)用一次,此后不會(huì)調(diào)用
    s = subscriber;       //將發(fā)送者保存到外部變量盹廷,因?yàn)閎lock外部需要發(fā)送信號
    [s sendNext:@"aaa"];
    return nil;
}] replayLazily];

NSLog(@"馬上發(fā)送消息bbb");//1.第一步打印
[s sendNext:@"bbb"];  //此時(shí)此刻發(fā)送失敗征绸,因?yàn)樯厦鍮lock未執(zhí)行,s值是nil

NSLog(@"11馬上訂閱消息");//2.第二步打印
[sig subscribeNext:^(id x) {//首次訂閱速和,上面的Block被執(zhí)行
    NSLog(@"11接收到:%@",x); //Block里發(fā)送了消息歹垫,此處收到消息:aaa
}];

[s sendNext:@"ccc"]; //繼續(xù)發(fā)送,會(huì)導(dǎo)致前面的訂閱者收到消息:ccc
[s sendNext:@"ddd"]; //繼續(xù)發(fā)送颠放,會(huì)導(dǎo)致前面的訂閱者收到消息:ddd
[s sendNext:@"eeee"];//繼續(xù)發(fā)送,會(huì)導(dǎo)致前面的訂閱者收到消息:eeee

[sig subscribeNext:^(id x) {//再次訂閱不會(huì)導(dǎo)致訂閱代碼再次執(zhí)行
    NSLog(@"222接收到:%@",x);  //前面發(fā)送的消息全部能收到:aaa吭敢、ccc碰凶、ddd、eeee
}];

[s sendNext:@"ffff"];//繼續(xù)發(fā)送,會(huì)導(dǎo)致前面的兩個(gè)訂閱者都收到消息:ffff

控制臺(tái)打印結(jié)果如下圖:

4.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欲低,一起剝皮案震驚了整個(gè)濱河市辕宏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌砾莱,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蕴坪,居然都是意外死亡锦庸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門闰非,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膘格,“玉大人,你說我怎么就攤上這事财松”窦” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵辆毡,是天一觀的道長菜秦。 經(jīng)常有香客問我,道長舶掖,這世上最難降的妖魔是什么喷户? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮访锻,結(jié)果婚禮上褪尝,老公的妹妹穿的比我還像新娘。我一直安慰自己期犬,他們只是感情好河哑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著龟虎,像睡著了一般璃谨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲤妥,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天佳吞,我揣著相機(jī)與錄音,去河邊找鬼棉安。 笑死底扳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贡耽。 我是一名探鬼主播衷模,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼鹊汛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阱冶?” 一聲冷哼從身側(cè)響起刁憋,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎木蹬,沒想到半個(gè)月后至耻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镊叁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年尘颓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片意系。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泥耀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛔添,到底是詐尸還是另有隱情痰催,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布迎瞧,位于F島的核電站夸溶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凶硅。R本人自食惡果不足惜缝裁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望足绅。 院中可真熱鬧捷绑,春花似錦、人聲如沸氢妈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽首量。三九已至壮吩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間加缘,已是汗流浹背鸭叙。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拣宏,地道東北人沈贝。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蚀浆,于是被迫代替她去往敵國和親缀程。 傳聞我的和親對象是個(gè)殘疾皇子搜吧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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