iOS开发RAC学习笔记(五)信号的组合

github源代码地址

信号的组合处理

  • 本部分参考了峥吖前辈的博客,并结合了自己的一些实践和想法

信号的依赖

  • 使用场景是当信号A执行完才会执行信号B,和请求的依赖很类似,例如请求A请求完毕才执行请求B,我们需要注意信号A必须要执行发送完成信号,否则信号B无法执行

      //这相当于网络请求中的依赖,必须先执行完信号A才会执行信号B
      //经常用作一个请求执行完毕后,才会执行另一个请求
      //注意信号A必须要执行发送完成信号,否则信号B无法执行
      RACSignal * concatSignal = [self.signalA concat:self.signalB];
    
      //这里我们是对这个拼接信号进行订阅
      [concatSignal subscribeNext:^(id x) {
    
          NSLog(@"%@",x);
    
      }];
    

信号的条件执行

  • 使用场景当信号A执行后才会执行信号B,同时信号A不会被订阅到,也就不会被执行

      //当地一个信号执行完才会执行then后面的信号,同时第一个信号发送出来的东西不会被订阅到
      @weakify(self);
      [[self.signalA then:^RACSignal *{
    
          @strongify(self);
          return self.signalB;
    
      }] subscribeNext:^(id x) {
    
          //这里只会打印出信号B的数据
          NSLog(@"%@",x);
    
      }];
    

信号的组合

  • 将信号A和信号B组合为一个信号,当其中一个信号发送数据时,组合信号也可以订阅到.

      RACSignal * nameSignal = [self.tf_name rac_textSignal];
    
      RACSignal * ageSignal = [self.tf_age rac_textSignal];
    
      //将两个信号组成为一个信号,若其中一个子信号发送了对象,那么组合信号也能够订阅到
      RACSignal * mergeSignal = [nameSignal merge:ageSignal];
    
      [mergeSignal subscribeNext:^(id x) {
    
          NSLog(@"%@",x);
    
      }];
    

信号的压缩,须成对

  • 信号A和信号B会压缩成为一个信号,当信号A和信号B发出的信号成对存在时这个压缩后的元祖才会触发压缩流的next事件,注意要'成对',不成对的话其中一个信号发送多次也不会被订阅到

      //信号A和B会压缩成为一个信号,当二者'同时'发送数据时,并且把两个信号的内容合并成一个元组,才会触发压缩流的next事件
      //注意这里的'同时'二字指的并不是时间上的同时,只要信号A发送,信号B也发送就可以了,并不需要同时,但一定要成对
      RACSignal * zipSignal1 = [self.signalA zipWith:self.signalB];
    
      [zipSignal1 subscribeNext:^(id x) {
    
          NSLog(@"%@",x);
    
      }];
    
      RACSignal * nameSignal = [self.tf_name rac_textSignal];
    
      RACSignal * ageSignal = [self.tf_age rac_textSignal];
    
      RACSignal * zipSignal2 = [nameSignal zipWith:ageSignal];
    
      //这里会把姓名和年龄输入框的信号包装成一个元祖,这里看起来效果会比较明显,年龄和姓名输入框若多次变动后,他们的信号呈现一个多一个少的情况下那么是无法订阅成功的
      //必须信号称对包装成元祖才可以
      [zipSignal2 subscribeNext:^(id x) {
    
          NSLog(@"%@",x);
    
      }];
    

信号的压缩,每个信号只要sendNext即可

  • 和zip相似,只要两个信号都发送过至少一次信号就会执行,不同的是zip要求更为苛刻,需要二者信号每次执行时都必须成对,否则无法订阅成功

      RACSignal * nameSignal = [self.tf_name rac_textSignal];
    
      RACSignal * ageSignal = [self.tf_age rac_textSignal];
    
      //和zip相似,只要两个信号都发送过至少一次信号就会执行,不同的是zip要求更为苛刻,需要二者信号每次执行时都必须成对,否则无法订阅成功
      RACSignal * combineSignal = [nameSignal combineLatestWith:ageSignal];
    
      [combineSignal subscribeNext:^(id x) {
    
          NSLog(@"%@",x);
    
      }];
    

信号的聚合

  • 先组合再聚合,聚合后和映射类似可以返回我们需要的数据格式

      RACSignal * nameSignal = [self.tf_name rac_textSignal];
    
      RACSignal * ageSignal = [self.tf_age rac_textSignal];
    
      //先组合再聚合
      //reduce后的参数需要自己添加,添加以前方传来的信号的数据为准
      //return类似映射,可以对数据进行处理再发送给订阅者
      RACSignal * reduceSignal = [RACSignal combineLatest:@[nameSignal,ageSignal] reduce:^id(NSString * name,NSString * age){
    
          return [NSString stringWithFormat:@"姓名:%@,年龄:%@",name,age];
    
      }];
    
      [reduceSignal subscribeNext:^(id x) {
    
          NSLog(@"%@",x);
      }];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容