RAC-应用场景(二)

一、导图

RAC-应用场景(二)_第1张图片
概要

二、具体实现

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

1、场景一:rac_liftSelector

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

解决方案:rac_liftSelector

-(void)demo_2 {
    //请求1
    RACSignal * signal_1 = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        //发送信号
        NSLog(@"发送网络数据");
        //发送数据
        [subscriber sendNext:@"数据1 来了!!"];
        return nil;
    }];
    
    //请求2
    RACSignal * signal_2 = [RACSignal createSignal:^RACDisposable * _Nullable(id  _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  _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  _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  _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-应用场景(二))