一、導(dǎo)圖

概要
二、具體實現(xiàn)
代碼地址:https://github.com/lionsom/LXReactiveCocoa_Demo
1、場景一:rac_liftSelector
當需要發(fā)送多個網(wǎng)絡(luò)請求,并且每個網(wǎng)絡(luò)請求成功之后才能夠進行頁面加載的情況。
解決方案:rac_liftSelector
-(void)demo_2 {
//請求1
RACSignal * signal_1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//發(fā)送信號
NSLog(@"發(fā)送網(wǎng)絡(luò)數(shù)據(jù)");
//發(fā)送數(shù)據(jù)
[subscriber sendNext:@"數(shù)據(jù)1 來了??!"];
return nil;
}];
//請求2
RACSignal * signal_2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//發(fā)送信號
NSLog(@"發(fā)送網(wǎng)絡(luò)數(shù)據(jù)");
//發(fā)送數(shù)據(jù)
[subscriber sendNext:@"數(shù)據(jù)2 來了!!"];
return nil;
}];
//數(shù)組:存放信號
//當數(shù)組中的所有信號都發(fā)送了數(shù)據(jù),才會執(zhí)行selector
//參數(shù):必須和數(shù)組的信號一一對應(yīng)
//參數(shù):就是每一個信號發(fā)送的數(shù)據(jù)
[self rac_liftSelector:@selector(updateUI::) withSignalsFromArray:@[signal_1,signal_2]];
}
//頁面刷新
-(void)updateUI:(NSString *)data1 :(NSString *)data2 {
NSLog(@"updateUI == %@ == %@",data1,data2);
}
2、場景二:RACMulticastConnection連接類
當同一個信號被多次訂閱的時候,信號就會發(fā)送多次相同的請求。很明顯是不合理的。
樣例代碼:
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//發(fā)送網(wǎng)絡(luò)請求
NSLog(@"發(fā)送請求");
//發(fā)送請求到的數(shù)據(jù)
[subscriber sendNext:@"請求到數(shù)據(jù)?。?];
return nil;
}];
//訂閱信號1
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"AA 處理數(shù)據(jù)%@",x);
}];
//訂閱信號2
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"BB 處理數(shù)據(jù)%@",x);
}];

運行結(jié)果:**相同的網(wǎng)絡(luò)請求,請求了兩次**
解決方案:RACMulticastConnection
//不管訂閱多少信號,就只會請求一次數(shù)據(jù)
//RACMulticastConnection連接類:用于 當一個信號被多次訂閱的時候,避免多次請求數(shù)據(jù)、、
//1、創(chuàng)建信號
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//發(fā)送網(wǎng)絡(luò)請求
NSLog(@"發(fā)送請求");
//發(fā)送請求到的數(shù)據(jù)
[subscriber sendNext:@"請求到數(shù)據(jù)!!"];
return nil;
}];
//2、將信號轉(zhuǎn)成一個連接類
RACMulticastConnection * connection = [signal publish];
//3、訂閱信號
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"AA 處理數(shù)據(jù)%@",x);
}];
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"BB 處理數(shù)據(jù)%@",x);
}];
//4、鏈接
[connection connect];

運行結(jié)果:**只請求一遍數(shù)據(jù),兩個地方都可以用**
3、場景三:RACCommand
RACCommand可以對一個事件進行控制和操作,具體看下代碼:對于命令處理到哪一步進行監(jiān)聽。
// RACCommand 命令 == 對事件的一個操作
//1、創(chuàng)建命令
RACCommand * command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
//input : 指令
NSLog(@"%@",input);
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//發(fā)送數(shù)據(jù)
[subscriber sendNext:@"執(zhí)行完命令之后產(chǎn)生的數(shù)據(jù)"];
//發(fā)送完成
[subscriber sendCompleted];
return nil;
}];
}];
//監(jiān)聽事件有沒有執(zhí)行完畢
[command.executing subscribeNext:^(NSNumber * _Nullable x) {
if ([x boolValue]) {
NSLog(@"正在執(zhí)行");
}else{
NSLog(@"已經(jīng)結(jié)束了&&還沒開始做");
}
}];
//2、執(zhí)行命令
RACSignal * signal = [command execute:@"執(zhí)行命令參數(shù)"];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"接收到了數(shù)據(jù)了:%@",x);
}];

運行結(jié)果:**對于事件處理到了哪一步都可以進行查看**
介紹一個RACCommand類的對象switchToLatest
switchToLatest : 最新的信號
//創(chuàng)建多個信號
RACSubject * signalOfSignal = [RACSubject subject];
RACSubject * signal_1 = [RACSubject subject];
RACSubject * signal_2 = [RACSubject subject];
//訂閱信號 switchToLatest:最新的信號
[signalOfSignal.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
//發(fā)送信號
[signalOfSignal sendNext:signal_1];
[signalOfSignal sendNext:signal_2];
[signal_1 sendNext:@"1"];
[signal_2 sendNext:@"2"];
看輸出結(jié)果:signal_2 是最新的信號
4、場景四:bind
//bind
//1、創(chuàng)建信號
RACSubject * subject = [RACSubject subject];
//2、綁定信號
RACSignal * bindSignal = [subject bind:^RACSignalBindBlock _Nonnull{
return ^RACSignal * (id value, BOOL * stop) {
NSLog(@"AAAA == %@",value);
//block調(diào)用:只要源信號發(fā)送數(shù)據(jù),就會調(diào)用bindBlock
//block作用:處理源信號內(nèi)容
//返回信號,不能傳nil,返回空信號:[RACSignal empty]
// return [RACSignal empty];
return [RACReturnSignal return:value];
};
}];
//3、訂閱信號
[bindSignal subscribeNext:^(id _Nullable x) {
NSLog(@"BBB == %@",x);
}];
//4、發(fā)送數(shù)據(jù)
[subject sendNext:@"發(fā)送原始的數(shù)據(jù)"];