美文网首页
RAC-应用场景(二)

RAC-应用场景(二)

作者: lionsom_lin | 来源:发表于2017-05-05 16:26 被阅读45次

    一、导图

    概要

    二、具体实现

    代码地址:https://github.com/lionsom/LXReactiveCocoa_Demo

    1、场景一:rac_liftSelector

    当需要发送多个网络请求,并且每个网络请求成功之后才能够进行页面加载的情况。
    

    解决方案:rac_liftSelector

    -(void)demo_2 {
        //请求1
        RACSignal * signal_1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            //发送信号
            NSLog(@"发送网络数据");
            //发送数据
            [subscriber sendNext:@"数据1 来了!!"];
            return nil;
        }];
        
        //请求2
        RACSignal * signal_2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            //发送信号
            NSLog(@"发送网络数据");
            //发送数据
            [subscriber sendNext:@"数据2 来了!!"];
            return nil;
        }];
        
        //数组:存放信号
        //当数组中的所有信号都发送了数据,才会执行selector
        //参数:必须和数组的信号一一对应
        //参数:就是每一个信号发送的数据
        [self rac_liftSelector:@selector(updateUI::) withSignalsFromArray:@[signal_1,signal_2]];
    }
    
    //页面刷新
    -(void)updateUI:(NSString *)data1 :(NSString *)data2 {
        NSLog(@"updateUI == %@ == %@",data1,data2);
    }
    

    2、场景二:RACMulticastConnection连接类

    当同一个信号被多次订阅的时候,信号就会发送多次相同的请求。很明显是不合理的。
    

    样例代码:

     RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            //发送网络请求
            NSLog(@"发送请求");
            //发送请求到的数据
            [subscriber sendNext:@"请求到数据!!"];
            
            return nil;
        }];
        
        //订阅信号1
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"AA 处理数据%@",x);
        }];
        //订阅信号2
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"BB 处理数据%@",x);
        }];
    
    运行结果:**相同的网络请求,请求了两次**

    解决方案:RACMulticastConnection

     //不管订阅多少信号,就只会请求一次数据
        //RACMulticastConnection连接类:用于 当一个信号被多次订阅的时候,避免多次请求数据、、
        //1、创建信号
        RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            //发送网络请求
            NSLog(@"发送请求");
            //发送请求到的数据
            [subscriber sendNext:@"请求到数据!!"];
            
            return nil;
        }];
        
        //2、将信号转成一个连接类
        RACMulticastConnection * connection = [signal publish];
        
        //3、订阅信号
        [connection.signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"AA 处理数据%@",x);
        }];
        [connection.signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"BB 处理数据%@",x);
        }];
        
        //4、链接
        [connection connect];
    
    运行结果:**只请求一遍数据,两个地方都可以用**

    3、场景三:RACCommand

    RACCommand可以对一个事件进行控制和操作,具体看下代码:对于命令处理到哪一步进行监听。
    
        // RACCommand 命令 == 对事件的一个操作
        //1、创建命令
        RACCommand * command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
            //input : 指令
            NSLog(@"%@",input);
            
            return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
                
                //发送数据
                [subscriber sendNext:@"执行完命令之后产生的数据"];
                
                //发送完成
                [subscriber sendCompleted];
                
                return nil;
            }];
        }];
        
        //监听事件有没有执行完毕
        [command.executing subscribeNext:^(NSNumber * _Nullable x) {
            if ([x boolValue]) {
                NSLog(@"正在执行");
            }else{
                NSLog(@"已经结束了&&还没开始做");
            }
        }];
        
        //2、执行命令
        RACSignal * signal = [command execute:@"执行命令参数"];
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"接收到了数据了:%@",x);
        }];
    
    运行结果:**对于事件处理到了哪一步都可以进行查看**
    介绍一个RACCommand类的对象switchToLatest
    switchToLatest : 最新的信号  
    
    //创建多个信号
        RACSubject * signalOfSignal = [RACSubject subject];
        RACSubject * signal_1 = [RACSubject subject];
        RACSubject * signal_2 = [RACSubject subject];
        
        //订阅信号 switchToLatest:最新的信号
        [signalOfSignal.switchToLatest subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        //发送信号
        [signalOfSignal sendNext:signal_1];
        [signalOfSignal sendNext:signal_2];
        [signal_1 sendNext:@"1"];
        [signal_2 sendNext:@"2"];
    

    看输出结果:signal_2 是最新的信号

    4、场景四:bind

     //bind
        //1、创建信号
        RACSubject * subject = [RACSubject subject];
        //2、绑定信号
        RACSignal * bindSignal = [subject bind:^RACSignalBindBlock _Nonnull{
            
            return ^RACSignal * (id value, BOOL * stop) {
                NSLog(@"AAAA == %@",value);
                //block调用:只要源信号发送数据,就会调用bindBlock
                //block作用:处理源信号内容
                
                //返回信号,不能传nil,返回空信号:[RACSignal empty]
    //            return [RACSignal empty];
                
                return [RACReturnSignal return:value];
            };
        }];
        
        //3、订阅信号
        [bindSignal subscribeNext:^(id  _Nullable x) {
            NSLog(@"BBB == %@",x);
        }];
        
        //4、发送数据
        [subject sendNext:@"发送原始的数据"];
    

    相关文章

      网友评论

          本文标题:RAC-应用场景(二)

          本文链接:https://www.haomeiwen.com/subject/dekstxtx.html