RACCommand

2018-09-18  本文已影响19人  frankisbaby

RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递包装到这个类中,它可以很方便的监控事件的执行过程。

使用场景:监听按钮点击事件,网络请求;

使用步骤:

1.创建命令:

RACCommand不能返回一个空的信号:

RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {

        //input为执行命令时传递的参数

        NSLog(@"%@",input);

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

            //执行完命令后,在这里发送数据

            [subscriber sendNext:@"拿到网络数据"];

            returnnil;

        }];

    }];

2.执行命令:

RACSignal *signal = [command execute:@100];

如何拿到执行命令产生的数据呢?需要订阅命令内部的信号

3.订阅信号

方法有三种:

1利用执行命令返回的信号进行订阅:

[signal subscribeNext:^(id  _Nullablex) {

        NSLog(@"%@",x);

    }];

注意:这种方式可以在执行之后订阅;

2.executionSignals为命令的信号源(信号中的信号),我们订阅它会返回命令中返回的信号:

[command.executionSignals subscribeNext:^(id  _Nullable x) {

        RACSignal*signal = x;

        [signalsubscribeNext:^(id  _Nullabledata) {

            NSLog(@"%@",data);

        }];

    }];

注意:这种方式必须在执行之前订阅;

3.switchToLatest获取最新发送的信号,只能用于信号中的信号

[command.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {

        NSLog(@"%@",x);

    }];

4.executing

[command.executing subscribeNext:^(NSNumber * _Nullable x) {

        if([x boolValue]) {//当前正在执行

            NSLog(@"当前正在执行");

        }else{

            NSLog(@"执行完成或没有执行");

        }

    }];

executing可以监控命令的执行,block返回值是一个NSNumber类型的布尔值,YES代表正在执行,NO代表执行完成或没有执行,在一执行subscribeNext就会执行没有执行的代码,[subscriber sendCompleted];执行完成之后会调用执行完成的代码;

上一篇下一篇

猜你喜欢

热点阅读