RACCommand

RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。 使用场景:监听按钮点击,网络请求。

  • RACCommand使用步骤:

    1. 创建命令 initWithSignalBlock:(RACSignal * (^)(id input))signalBlock;
    2. signalBlock中,创建RACSignal,并且作为signalBlock的返回值;
    3. 执行命令 -(RACSignal *)execute:(id)input;
  • RACCommand使用注意:

    1. signalBlock必须要返回一个信号,不能传nil.
    2. 如果不想要传递信号,直接创建空的信号[RACSignal empty];
    3. RACCommand中信号如果数据传递完,必须调用[subscriber sendCompleted],这时命令才会执行完毕,否则永远处于执行中。
    4. RACCommand需要被强引用,否则接收不到RACCommand中的信号,因此RACCommand中的信号是延迟发送的。
    //创建命令
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        //block调用,执行命令的时候就会调用
        NSLog(@"input:%@",input); // input 为执行命令传进来的参数
        // 这里的返回值不允许为nil
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@"执行命令产生的数据"];
            return nil;
        }];
    }];

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

    // ** 方式一:直接订阅执行命令返回的信号
    // 2.执行命令
    RACSignal *signal =[command execute:@2]; // 这里其实用到的是replaySubject 可以先发送命令再订阅
    // 在这里就可以订阅信号了
    [signal subscribeNext:^(id x) {
        NSLog(@"x:%@",x);
    }];

    // ** 方式二:直接订阅执行命令返回的信号
    // 订阅信号, 注意:这里必须是先订阅才能发送命令
    // executionSignals:信号源,信号中信号,signalofsignals:信号,发送数据就是信号
    [command.executionSignals subscribeNext:^(RACSignal *x) {
        [x subscribeNext:^(id x) {
            NSLog(@"x1:%@", x);//后打印,一个对象
        }];
        NSLog(@"x2:%@", x); //先打印,一个信号
    }];
    // 2.执行命令
    [command execute:@2];

    // ** 方式三:
    // switchToLatest获取最新发送的信号,只能用于信号中信号。
    [command.executionSignals.switchToLatest subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    // 2.执行命令
    [command execute:@3];
  • RACCommand 通常用来表示某个Action的执行,比如点击Button。它有几个比较重要的属性:executionSignals / errors / executing

    1. executionSignalssignalOfSignals,如果直接subscribe的话会得到一个signal,而不是我们想要的value,所以一般会配合switchToLatest
    2. errors跟正常的signal不一样,RACCommand的错误不是通过sendError来实现的,而是通过errors属性传递出来的。
    3. executing表示该command当前是否正在执行。

      RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
      NSLog(@"%@",input);
      return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"执行命令产生的数据"];
        [subscriber sendCompleted];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"信号源注销...");
        }];
       }];
      }];
      
      //监听事件有没有完成
      [command.executing subscribeNext:^(id x) {
        if ([x boolValue] == YES) {
            NSLog(@"正在执行:%@",x);
        }else{
            NSLog(@"执行完成/没有执行");
        }
      }];
      [command execute:@"Jon Snow"];
      

results matching ""

    No results matching ""