5.RAC值之RACCommand

RACCommand一般用来处理事件,监听按钮点击,网络请求等。
先看下RACCommand简单使用

RACCommand的使用很简单,就两步
1:创建命令
RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
       // 这里必须返回一个信号,不能返回为nil,会崩溃
       // 如果不想传递信号,可以发出空信号 [RACSignal empty];

       // block调用时刻: [command execute:@1];
       NSLog(@"请求网络数据%@",input);
       
      // 请求网络数据完毕,怎么将网络产生的数据发送出去呢?
      // 怎么发送? 就得靠下面这个RACSignal去发送,只要有人订阅了RACSignal,RACSignal数据就发送得出去
       return [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
            [subscriber sendNext:@"发送网络数据”];
            //如果不再继续发送数据,要发送完成信号
            [subscriber sendCompleted];
             return nil;
        }];
}];
2:执行命令
[command execute:@1];

如何订阅命令中的RACSignal信号呢?
有三种方法

  • 方法一,最简单的一种
    你们查看 execute: 方法,它返回的就是一个RACSignal
- (RACSignal *)execute:(id)input

所以,我们可以直接订阅这个返回来的RACSignal

RACSignal *signal = [command execute:@1];
[signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x); 
}];
  • 方法二,稍微复杂点
    RACCommand 中有个属性executionSignals,它表示信号中的信号。
    对了,这里有个要注意的地方,方法二必须要在执行命令execute之前执行
// 看打印结果可知,command.executionSignals 拿到的是一个RACSignal
 [command.executionSignals subscribeNext:^(RACSignal * x) {
        NSLog(@"%@",x); // x == RACDynamicSignal
        [x subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
     }];
[command execute:@1];
  • 方法三,高级用法
    switchToLatest 获取最新发送的信号,只能用于信号中的信号
[command.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
[command execute:@1];

RACCommand还有一个比较好用的属性,executing,它用来监听事件有没有完成

比如:当你点击一个按钮访问网络的时候,你总不能每次点的时候都访问网络吧,肯定要等网络处理完成之后才能继续点,这个时候,你就可以用到这个属性

// executing 直接返回一个 RACSignal
@property (nonatomic, strong, readonly) RACSignal *executing;

// 监听事件有没有完成,
    [command.executing subscribeNext:^(NSNumber * _Nullable x) {
        if ([x boolValue] == YES) {
            NSLog(@"当前正在执行");
        }
        else {
            NSLog(@"执行完成/没有执行");
        }
    }];

你可能感兴趣的:(5.RAC值之RACCommand)