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

作者: Link913 | 来源:发表于2016-08-29 16:10 被阅读1784次

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);
      }];

相关文章

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

    github源代码地址 信号的组合处理 本部分参考了峥吖前辈的博客,并结合了自己的一些实践和想法 信号的依赖 使用...

  • RAC信号组合

    转自iOS开发 「RAC」RAC信号组合的妙用[https://www.jianshu.com/p/eba85d2...

  • iOS开发 「RAC」RAC信号组合的妙用

    • concat:按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号,依赖关系把一组信号串联起来,前面一个...

  • RAC简介

    前言 RAC是iOS开发中经常使用到响应式框架,在OC中可以通过pod导入 RAC信号创建与发送 RAC中一个常见...

  • 【Objective-c】_蓝牙开发

    ios蓝牙开发学习笔记(一)蓝牙概述 ios蓝牙开发学习笔记(二)central角色的实现 ios蓝牙开发学习笔记...

  • RAC基础

    最近接触学习到了RAC(ReactiveCocoa),RAC是函数式+响应式编程结合 我们在iOS开发中,页面之间...

  • 6.RAC之组合信号

    RAC的组合信号有以下几种 1. concat concat组合信号,让信号按照顺序去执行。假如我们现在有这么一个...

  • ReactiveObjC(RAC)基础

    最近学习了一下RAC的使用,参考了下面两篇文章 Jonzzs的【iOS 开发】ReactiveObjC(RAC)的...

  • RAC之信号组合

    1.1,依赖concat,比如A请求依赖B请求,只有B请求完成之后才能执行A请求或操作 1.2,依赖then,比如...

  • iOS开发RAC学习笔记(八)信号的调度器RACSchedule

    github源代码地址 信号的调度器RACScheduler(多线程) deliverOn 在上一篇我们讲到过RA...

网友评论

    本文标题:iOS开发RAC学习笔记(五)信号的组合

    本文链接:https://www.haomeiwen.com/subject/eqoxettx.html