ReactiveCocoa常用类练习

#pragma mark - RAC Text

- (void)RACMethod {
    /*************************************************************************************
     1⃣️.RACSignal信号类
     操作步骤:
     创建信号(冷信号)-->订阅信号(热信号)-->发送数据

     RACSignal:表示有数据传输的时候
     RACDisposable:取消订阅信号
     RACSubscriber:订阅者,发送数据
     *************************************************************************************/
    // 1.创建信号
    RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        // 在信号被订阅的时候会调用
        // 作用是在这里面传输数据

        // 3.发送数据
        [subscriber sendNext:@"我是第1个信号"];
        return nil;

    }];

    // 2.订阅信号(x就是传输的数据)
    [signal1 subscribeNext:^(id  _Nullable x) {
        // 在信号内部发送数据的时候会调用,并且会把值传输给你
        // 作用是处理数据

        NSLog(@"%@",x);
    }];
    NSLog(@"===================");



    /************************************************************************************
     2⃣️.RACDisposable:取消订阅或者清理对象
     只要订阅者一直在,就表示需要订阅信号,信号就不会自动被取消订阅,所以当我们不需要的时候,需要手动取消订阅
     *************************************************************************************/
    RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:@"我是第2个信号"];

        return [RACDisposable disposableWithBlock:^{
            //当信号取消定订阅的时候调用
            NSLog(@"呜呜呜~我要被取消订阅了");
        }];
    }];

    RACDisposable *disposable1 = [signal2 subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

    //取消订阅(主动取消)
    [disposable1 dispose];
    NSLog(@"===================");


    /*************************************************************************************
     3⃣️.RACSubject:信号提供者
     信号提供者既可以充当信号,也可以充当订阅者,发送数据;
     一个信号允许被多次订阅
     *************************************************************************************/
    // 创建信号
    RACSubject *subject = [RACSubject subject];

    // 订阅信号
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"第一个订阅者:%@",x);
    }];

    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"第二个订阅者:%@",x);
    }];

    //发送信号
    [subject sendNext:@"RAC"];
    NSLog(@"===================");


    /*************************************************************************************
     4⃣️.RACReplaySubject:重复信号的提供类,它是RACSubject的子类。
     RAC允许先发送信号,再订阅信号。RACReplaySubject就是一个重复信号的提供者
     *************************************************************************************/
    // 创建信号
    RACReplaySubject *relpaySubject = [RACReplaySubject subject];

    // 发送信号-会把所有发送的数据保存到数组中,然后遍历所有的订阅者,分别调用nextBlock
    [relpaySubject sendNext:@"R"];
    [relpaySubject sendNext:@"A"];
    [relpaySubject sendNext:@"C"];

    // 订阅信号
    [relpaySubject subscribeNext:^(id  _Nullable x) {
        NSLog(@"第1个订阅者:%@",x);
    }];

    [relpaySubject subscribeNext:^(id  _Nullable x) {
        NSLog(@"第2个订阅者:%@",x);
    }];
    NSLog(@"===================");



    /*************************************************************************************
     5⃣️.RACMulticastConnection
     RACMulticastConnection用于当一个信号被多次订阅时,为了保证创建信号时多次调用创建信号中的block造成副作用;
     这样下来一个信号即使被订阅多次,也只是发送一次请求;
     用于信号中请求数据,避免多次请求数据
     *************************************************************************************/
    // 创建信号
    RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        // 发送信号
        [subscriber sendNext:@"网络数据"];

        return nil;
    }];

    // 把信号转换为连接类
    RACMulticastConnection *connection = [signal3 publish];

    // 订阅连接类的信号(注意:是连接类的信号,不再是原来的信号类),这样只会调用一次创建信号时的block
    [connection.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

    [connection.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

    // 连接
    [connection connect];
    NSLog(@"===================");


    /*************************************************************************************
     6⃣️.RACCommand用于处理事件:
     RACCommand是RAC中用于处理事件的类,可以把怎么处理事件,事件中的数据如何传递包装到这个类中;
     它可以很方便的监控事件的执行过程(监听按钮点击、网络请求);
     RACCommand使用时内部不允许传入一个nil的信号;
     使用步骤:创建命令->执行命令;
     *************************************************************************************/
    // 1.创建命令
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {

        // SignalBlock在命令一执行就会调用,为了处理事件
        NSLog(@"%@",input);

        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {

            NSLog(@"didSubscribe");

            // 执行命令的过程中就会调用,用于传输数据
            //订阅者subscriber-->[RACReplaySubject subject]

            [subscriber sendNext:@"我发送数据啦~"];

            return nil;

        }];

    }];

    // 2.执行命令(会调用signalBlock)
    RACReplaySubject *replaySubject2 = (RACReplaySubject *)[command execute:@"执行命令"];

    // 3.获取命令中产生的数据,订阅信号
    [replaySubject2 subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    NSLog(@"===================");


    /**************************************************************************************
     7⃣️.switchToLatest用法
     switchToLatest:只能用于signalOfSignals
     作用:就是拿到signalOfSignals发出的最新信号
     **************************************************************************************/
    // 实例一
    // 1.创建一个信号中的信号,只能发送信号
    RACSubject *signalOfSignal = [RACSubject subject];

    //创建信号,发送普通数据
    RACSubject *signalA = [RACSubject subject];
    RACSubject *signalB = [RACSubject subject];

    // 2.订阅信号中的信号,拿到signal发出值
    // 获取信号中的信号发送最新信号
    [signalOfSignal.switchToLatest subscribeNext:^(id  _Nullable x) {
        // 只会输出最后发送的数据
        NSLog(@"%@",x);
    }];

    // 3.发送信号
    [signalOfSignal sendNext:signalA];
    [signalOfSignal sendNext:signalB];

    // 信号发送数据
    [signalA sendNext:@"发送普通数据1"];
    [signalB sendNext:@"发送普通数据2"];
    NSLog(@"===================");

    // 实例二
    // 创建命令
    RACCommand *command2 = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        // 1.当执行命令的时候会调用SignalBlock,在这里可以处理网络请求
        NSLog(@"***%@",input);

        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {

            // 2.执行完SignalBlock,接着就会调用下面

            // 传送数据
            [subscriber sendNext:@"请求到的网络数据"];

            // 当数据传输完成,命令就执行完成
            [subscriber sendCompleted];

            return nil;
        }];
    }];

    // 直接获取命令中新发出信号
    [command2.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

    // 订阅当前命令执行状态的信号(正在执行/没有执行)
    [command2.executing subscribeNext:^(NSNumber * _Nullable x) {
        //x=YES(正在执行)   x=NO(没有执行/执行完成)
        //每次状态改变的时候会调用
        if ([x boolValue] == YES)
        {
            NSLog(@"正在执行");
        }
        else if ([x boolValue] == NO)
        {
            NSLog(@"没有执行或者已经执行完成");
        }
    }];
    
    // 2.执行命令
    [command2 execute:@"哈喽啊"];
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值