RAC-應(yīng)用場景(二)

一、導(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ù)"];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容