組合:
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;
}