RAC中常見的高級用法-組合

組合:

concat組合:

按一定順序執(zhí)行皇上與皇太子關(guān)系

concat底層實(shí)現(xiàn):

1.當(dāng)拼接信號被訂閱文虏,就會調(diào)用拼接信號的didSubscribe

2.didSubscribe中會先訂閱第一個源信號(signalA)

3.會執(zhí)行第一個源信號(signalA)的didSubscribe

4.第一個源信號(signalA)didSubscribe中發(fā)送值,就會調(diào)用第一個源信號(signalA)訂閱者的nextBlock,通過拼接信號的訂閱者把值發(fā)送出來.

5.第一個源信號(signalA)didSubscribe中發(fā)送完成芋类,就會調(diào)用第一個源信號(signalA)訂閱者的completedBlock,訂閱第二個源信號(signalB)這時候才激活(signalB)长踊。

6.訂閱第二個源信號(signalB),執(zhí)行第二個源信號(signalB)的didSubscribe

7.第二個源信號(signalA)didSubscribe中發(fā)送值,就會通過拼接信號的訂閱者把值發(fā)送出來.

//創(chuàng)建信號A

RACSignal*signalA =[RACSignal createSignal:^RACDisposable*(id subscriber) {

//發(fā)送請求

NSLog(@"上半部分的請求");

//發(fā)送信號

[subscriber sendNext:@"上半部分?jǐn)?shù)據(jù)"];

//發(fā)送完畢

//加上后就可以上部分發(fā)送完畢后發(fā)送下半部分信號试吁,這個必須要把信號A這個關(guān)閉,要不信號B就無法觸發(fā)

[subscriber sendCompleted];

return nil;

}];

//創(chuàng)建信號B

RACSignal*signalB =[RACSignal createSignal:^RACDisposable*(id subscriber) {

//發(fā)送請求

NSLog(@"下半部分的請求");

//發(fā)送信號

[subscriber sendNext:@"下半部分?jǐn)?shù)據(jù)"];

return nil;

}];

//創(chuàng)建組合信號

// contact:按順序去連接(組合)

//注意:第一個信號必須調(diào)用sendCompleted

RACSignal*contactSignal = [signalA concat: signalB];

//訂閱組合信號

[contactSignal subscribeNext:^(id x) {

//按順序觸發(fā)谒撼,當(dāng)A信號觸發(fā)完后食寡,才可使走信號B中的方法,輸出結(jié)果可以出結(jié)果

NSLog(@"%@",x);

}];

輸出結(jié)果:

2016-08-15 10:02:23.060 RAC——oneday[2742:23026]上半部分的請求

2016-08-15 10:02:27.951 RAC——oneday[2742:23026]上半部分?jǐn)?shù)據(jù)

2016-08-15 10:02:29.806 RAC——oneday[2742:23026]下半部分的請求

2016-08-15 10:02:32.961 RAC——oneday[2742:23026]下半部分?jǐn)?shù)據(jù)

then:

用于連接兩個信號廓潜,當(dāng)?shù)谝粋€信號完成抵皱,才會連接then返回的信號

注意: 使用then之前的信號的值會被忽略掉.

底層實(shí)現(xiàn):

1善榛、先過濾掉之前的信號發(fā)出的值。

2.使用concat連接then返回的信號

//創(chuàng)建信號A

RACSignal*signalA = [RACSignalvcreateSignal:^RACDisposable*(id subscriber) {

//發(fā)送請求

NSLog(@"發(fā)送上部分的請求");

//發(fā)送信號

[subscriber sendNext:@"上部分的數(shù)據(jù)"];

//發(fā)送完畢

//加上后就可以發(fā)送上部分的完畢后發(fā)送下部分的信號

[subscriber sendCompleted];

return nil;?

}];

//創(chuàng)建信號B

RACSignal*signalB = [RACSignal createSignal:^RACDisposable*(id subscriber) {

//發(fā)送請求

NSLog(@"發(fā)送下部分的請求");

//發(fā)送信號

[subscriber sendNext:@"下部分的數(shù)據(jù)"];

return nil;

}];

//創(chuàng)建組合信號

//then會忽略點(diǎn)第一個信號的所有值

RACSignal*signalThen = [signalA then:^RACSignal*{

//返回的信號就是需要組合的信號呻畸,這里回將signalA信號忽略點(diǎn)

return signalB;

}];

//訂閱信號

[signalThen subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

2016-08-15 10:06:27.643 RAC——oneday[4045:39265]發(fā)送上部分的請求

2016-08-15 10:06:27.645 RAC——oneday[4045:39265]發(fā)送下部分的請求

2016-08-15 10:06:31.261 RAC——oneday[4045:39265]下部分的數(shù)據(jù)

merge

把多個信號合并為一個信號移盆,任何一個信號有新值的時候就會調(diào)用,沒有順序

//創(chuàng)建信號A

RACSubject*siganlA = [RACSubject subject];

//創(chuàng)建信號B

RACSubject*signalB = [RACSubject subject];

//組合信號

RACSubject*signalMerage = [siganlA merge:signalB];

//訂閱信號

[signalMerage subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

//發(fā)送數(shù)據(jù),這里的發(fā)送消息不一定需要哪個信號發(fā)送完畢后才可以伤为,沒有限制

[signalB sendNext:@"下半部數(shù)據(jù)"];

[siganlA sendNext:@"上半部數(shù)據(jù)"];

2016-08-15 10:20:40.660 RAC——oneday[4894:49228]下半部數(shù)據(jù)

2016-08-15 10:20:40.660 RAC——oneday[4894:49228]上半部數(shù)據(jù)

zipWith:

等所有信號都發(fā)送內(nèi)容的時候才會調(diào)用(夫妻關(guān)系)

把兩個信號壓縮成一個信號咒循,只有當(dāng)兩個信號同時發(fā)出信號內(nèi)容時,并且把兩個信號的內(nèi)容合并成一個元組绞愚,才會觸發(fā)壓縮流的next事件

底層實(shí)現(xiàn):

1.定義壓縮信號叙甸,內(nèi)部就會自動訂閱signalA,signalB

2.每當(dāng)signalA或者signalB發(fā)出信號位衩,就會判斷signalA裆蒸,signalB有沒有發(fā)出個信號,有就會把最近發(fā)出的信號都包裝成元組發(fā)出糖驴。

//創(chuàng)建信號A

RACSubject*signalA = [RACSubject subject];

//創(chuàng)建信號B

RACSubject*signalB = [RACSubject subject];

//壓縮成一個信號

//當(dāng)一個界面多個請求時僚祷,需要等所有的請求都完成才能更新UI

//打印順序跟組合順序,跟發(fā)送的順序無關(guān)

//把兩個信號合成一個信號

RACSignal*signalZipwith = [signalA zipWith:signalB];

//訂閱信號

[signalZipwith subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

//發(fā)送信號

[signalA sendNext:@"LUO"];

[signalB sendNext:@"CRAZY"];

2016-08-15 10:32:19.272 RAC——oneday[5618:57722] (

LUO,

CRAZY

)

combineLatest:

將多個信號合并起來贮缕,并且拿到各個信號的最新的值,必須每個合并的signal至少都有過一次sendNext辙谜,才會觸發(fā)合并的信號。

底層實(shí)現(xiàn):

1.當(dāng)組合信號被訂閱感昼,內(nèi)部會自動訂閱signalA筷弦,signalB,必須兩個信號都發(fā)出內(nèi)容,才會被觸發(fā)抑诸。

2.并且把兩個信號組合成元組發(fā)出。

//創(chuàng)建信號A

RACSubject*signalA = [RACSubject subject];

//創(chuàng)建信號B

RACSubject*signalB = [RACSubject subject];

//把兩個信號合成一個信號

RACSignal*signalCombineLatest = [signalA combineLatestWith:signalB];

//訂閱組合信號

[signalCombineLatest subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

[signalA sendNext:@"A"];

[signalB sendNext:@"B"];?

2016-08-15 10:43:47.345 RAC——oneday[6427:66814] (

A,

B

)

reduce聚合:用于信號發(fā)出的內(nèi)容是元組爹殊,把信號發(fā)出元組的值聚合成一個值

常見的用法(先組合在聚合)蜕乡。combineLatest:(id)signals reduce:(id (^)())reduceBlock

reduce中的block簡介:

reduceblcok中的參數(shù),有多少信號組合梗夸,reduceblcok就有多少參數(shù)层玲,每個參數(shù)就是之前信號發(fā)出的內(nèi)容

reduceblcok的返回值:聚合信號之后的內(nèi)容。

底層實(shí)現(xiàn):

訂閱聚合信號反症,每次有內(nèi)容發(fā)出辛块,就會執(zhí)行reduceblcok,把信號內(nèi)容轉(zhuǎn)換成reduceblcok返回的值铅碍。

- (void)combineLatestWithReduce

{

/*登錄界面:兩個文本框(賬戶,密碼) + 一個登錄按鈕*/

//組合多個信號

//reduce:聚合

//reduceBlock的參數(shù)與組合的信號一一對應(yīng),可以在reduce:后拿到信號的值

RACSignal *combineSignal = [RACSignal combineLatest:@[_accountName.rac_textSignal, _passWord.rac_textSignal] reduce:^id(NSString *account, NSString *pwd){

//block:只要源信號發(fā)送內(nèi)容就會調(diào)用,組合成新的一個值

//聚合的值就是組合信號的內(nèi)容

return @(account.length && pwd.length);

}];

//訂閱信號

//? ? [combineSignal subscribeNext:^(id x) {

//? ? ? ? self.loginBtn.enabled = [x boolValue];

//

//? ? }];

//等同于

RAC(self.loginBtn, enabled) = combineSignal;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末润绵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胞谈,更是在濱河造成了極大的恐慌尘盼,老刑警劉巖憨愉,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卿捎,居然都是意外死亡配紫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門午阵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躺孝,“玉大人,你說我怎么就攤上這事底桂≈才郏” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵戚啥,是天一觀的道長奋单。 經(jīng)常有香客問我,道長猫十,這世上最難降的妖魔是什么览濒? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮拖云,結(jié)果婚禮上贷笛,老公的妹妹穿的比我還像新娘。我一直安慰自己宙项,他們只是感情好乏苦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尤筐,像睡著了一般汇荐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盆繁,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天掀淘,我揣著相機(jī)與錄音,去河邊找鬼油昂。 笑死革娄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冕碟。 我是一名探鬼主播拦惋,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼安寺!你這毒婦竟也來了厕妖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤我衬,失蹤者是張志新(化名)和其女友劉穎叹放,沒想到半個月后饰恕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡井仰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年埋嵌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俱恶。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡雹嗦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出合是,到底是詐尸還是另有隱情了罪,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布聪全,位于F島的核電站泊藕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏难礼。R本人自食惡果不足惜娃圆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛾茉。 院中可真熱鬧讼呢,春花似錦、人聲如沸谦炬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽键思。三九已至础爬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吼鳞,已是汗流浹背幕帆。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赖条,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓常熙,卻偏偏與公主長得像纬乍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帽借,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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