RACSignal指令汇总

188 阅读16分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情 。如果哪里写的不对,请大家评论批评。

今天突发奇想,暂停了两天的算法文章(实际上一直在学习动态规划,感觉还没有彻底了解,文章还没办法书写)。找到了当时学习RAC时候的文章

RACSignal

RACSignal:每次订阅都会完整的执行didSubscriber方法。重新调用新的nextBlock()本身不具备发送信号的能力,发送信号的是

信号映射:map、flattenMap

信号过滤:filter、ignore、distinctUntilChanged

信号合并:combineLatest、reduce、merge、zipWith

信号连接:concat、then

信号操作时间:timeout、interval、delay、throttle

信号跳过:skip

信号取值:take、takeLast、takeUntil

信号发送顺序:donext、cocompleted

获取信号中的信号:switchToLatest

信号错误重试:retry

各类操作

值操作

map 做一个映射,返回新的信号

mapReplace 等价于返回同一个值得map

reduceEach,是map:的变体。当signalA的值事件包裹的数据是RACTuple类型时,才可以使用该操作,将RACTuple组合成一个

reduceApply,要求值事件包裹的数据类型是RACTuple,并且该RACTuple的第一个元素是一个block,后面的元素作为该block的参数传入,返回该block的执行结果。

数量操作

bind 绑定

filter 过滤

ignore 忽略

take 只取前n个

skip 过滤掉前n个

startWith 从某个元素开始

distinctUntilChanged 去重复

repeat 重复

try 当error发生时重新订阅信号,retryCount有次数限制

collect 把所以集合到一个

scan 实时输出, aggregate 最终结束才输出,出错则不输出

副作用操作

doNext doError doCompleted

initially finally

时间操作

concat 加在后面

merge 插入进来

throttle

zip 两个信号合成一个RACTuple

combineLatest a信号来一个值事件就和b信号最近的值事件组合

sample 类似取景和快门

takeUntil signalC事件流中的事件和signalA一一对应,直到signalB事件流中出现了信号,事件流就终结。

interval 定时器,设置间隔 设置优先级

运算符

or

方法解释

MAP

一般是用来信号变换的,用来转化传递的信号的值的

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         [subscriber sendNext:@3];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[sourceSignal map:^id _Nullable(id  _Nullable value) {
         // BLOCK 1
         return @([value integerValue] + 1);
     }] subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

flatten

与merge类似 merge是类方法 从字面看是压扁、扁平的意思,而对于 RACSignal 来说,可以理解为 解包、降阶 的意思。

     RACSignal *sourceSignal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendCompleted];
         return nil;
     }];
     sourceSignal1.name = @"sourceSignal1";
     
     RACSignal *sourceSignal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@2];
         [subscriber sendNext:@3];
         [subscriber sendCompleted];
         return nil;
     }];
     sourceSignal2.name = @"sourceSignal2";
     
     RACSignal *sourceSignal3 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:sourceSignal1];
         [subscriber sendNext:sourceSignal2];
         [subscriber sendCompleted];
         return nil;
     }];
     sourceSignal3.name = @"sourceSignal3";
     
     [[sourceSignal3 flatten] subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

flatten:

都是对高阶信号进行降阶、解包操作,但是前者多一个入参 maxConcurrent 来控制同一时间对高阶信号发出的子信号的订阅动作。

     RACSignal *signal0 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@1];
             [subscriber sendCompleted];
         });
         return nil;
     }];
     
     RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@2];
             [subscriber sendCompleted];
         });
         return nil;
     }];
     
     RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:@3];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:signal0];
         [subscriber sendNext:signal1];
         [subscriber sendNext:signal2];
         [subscriber sendNext:signal3];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[sourceSignal flatten:2] subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

flattenMap

对传递过来的信号进行二次定义 通过调用block(value)来创建一个新的方法,它可以灵活的定义新创建的信号。

     RACSignal *sg1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:@"1"];
         return nil;
     }];
     
     // 对传递过来的信号进行二次定义
     RACSignal *flSig = [sg1 flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
          return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
             [subscriber sendNext:[NSString stringWithFormat:@"flattenMap-%@",value]];
             return nil;
         }];
      
     }];
     
     [flSig subscribeNext:^(id  _Nullable x) {
         NSLog(@"%@",x);
     }];

bind

把当前信号绑定到新的信号上,在闭包中进行信号变换,变换中用到的block闭包中value是原来信号的值,把原来信号的值转换成新的信号的值,进行输出

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         
         [subscriber sendNext:@(1)];
         [subscriber sendNext:@(2)];
         [subscriber sendNext:@(3)];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *bindSignal = [sourceSignal bind:^RACSignalBindBlock _Nonnull{
         // BLOCK 2
         return ^RACSignal *(id value,  BOOL *stop) {
             // BLOCK 3
             if ([value integerValue] == 2) {
                 *stop = YES;
             }
             value = @([value integerValue] + 1);
             return [RACSignal return:value];
         };
     }];
     
     [bindSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"%@", x);//2 3 4
     }];

try-catch

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         [subscriber sendNext:@3];
         [subscriber sendCompleted];
         return [RACDisposable disposableWithBlock:^{
             NSLog(@"source signal dispose");
         }];
     }];
     
     RACSignal *trySignal = [[sourceSignal try:^BOOL(id  _Nullable value, NSError * _Nullable __autoreleasing * _Nullable errorPtr) {
         NSInteger i = [value integerValue];
         if (i > 2) {
             *errorPtr = [NSError errorWithDomain:@"" code:-1 userInfo:nil];
             return NO;
         }
         return YES;
     }]retry:2];
     
     [trySignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];
     
     [trySignal subscribeError:^(NSError * _Nullable error) {
         NSLog(@"error = %@", error);
     }];

mapReplace

不管信号发送什么值,都替换成xxx

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"吃饭"];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *signalB = [eat mapReplace:@"A"];
     [signalB subscribeNext:^(id  _Nullable x) {
         NSLog(@"--------%@",x);//--------A
     }];

concat

把一组信号串联起来,前面一个信号complete,后面一个信号才开始发挥作用

merge

把一组信号并联起来,信号不分前后

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"吃饭"];
         [subscriber sendNext:@"完毕"];
         //      [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *work = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"上班"];
         [subscriber sendNext:@"完毕"];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[eat concat:work]subscribeNext:^(id x) {
         NSLog(@"--- %@",x);
         //--- 吃饭
         //--- 完毕
     }];
     [[eat merge:work]subscribeNext:^(id x) {
         NSLog(@"%@",x);
         //吃饭
         //完毕
         //上班
         //完毕
     }];

zip:

函数主要是将多个信号发送的值”同步”地压缩打包成 RACTuple 发送给订阅者。这里”同步”是指压缩的时候需要等最迟发送的信号发送 sendNext 之后再发送给最终的订阅者 类方法:可以添加多个信号 返回RACTuple

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"1111"];
 //        [subscriber sendNext:@"2222"];
         [subscriber sendCompleted];
         return nil;
     }];
     RACSignal *work = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"3333"];
         [subscriber sendNext:@"4444"];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *signal24 = [RACSignal zip:@[eat,work]];
     [signal24 subscribeNext:^(id  _Nullable x) {
         NSLog(@"--%@",x);//(1111,3333)(2222,4444)
     }];

zipWith

与zipwith一样 实例方法: 只能添加一个返回RACTwoTuple

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"吃饭"];
         [subscriber sendNext:@"完毕"];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *work = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"上班"];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[eat zipWith:work] subscribeNext:^(id  _Nullable x) {
         NSLog(@"--%@",x);//(1111,3333)(2222,4444)
     }];

zip:reduce

对zip的在此封装,reduce,可以吧zip的返回值进行操作之后在返回,返回类型值类型

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"1111"];
         [subscriber sendNext:@"2222"];
         [subscriber sendCompleted];
         return nil;
     }];
     RACSignal *work = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"3333"];
         [subscriber sendNext:@"4444"];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *signal24 = [RACSignal zip:@[eat,work] reduce:^id(NSString *first,NSString *second){
         return [NSString stringWithFormat:@"%@%@",first,second];
     }];
     [signal24 subscribeNext:^(id  _Nullable x) {
         NSLog(@"%@",x);//11113333 22224444
     }];

reduceEach

看zip:reduce: 可以得知,把组数据RACTuple转换返回一个值

ignore

忽略信号中的某些值

     RACSignal *sourceSignal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@(1)];
         [subscriber sendNext:@(2)];
         [subscriber sendNext:@(3)];
         [subscriber sendCompleted];
         return nil;
     }] filter:^BOOL(NSNumber*  value) {
         if ([value intValue] == 2) {// ==2 被过滤
             return NO;
         }
         return YES;
     }];
     
     [[sourceSignal ignore:@(3)] subscribeNext:^(id  _Nullable x) {
         NSLog(@"--------%@",x);
         //1
     }];

ignoreValues

将所有输入信号都忽略掉

startWith

信号会首先发送一个值,实现原理是concat

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"吃饭"];
         [subscriber sendNext:@"完毕"];
         [subscriber sendCompleted];
         return nil;
     }];
     RACSignal *signal24 = [eat startWith:@"开始"];
     [signal24 subscribeNext:^(id  _Nullable x) {
         NSLog(@"--%@",x);//开始 吃饭 完毕
     }];

doNext

和startWith相似 传入block 闭包,该闭包的参数就是原信号发送的值,当给订阅者发送 sendNext 之前会执行 block 闭包

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"source signal"];
         
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[sourceSignal doNext:^(id  _Nullable x) {
         NSLog(@"sourceSignal doNext will execute before sendNext");
     }] subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

skip

跳过前几次的值

方法内补也是通过 -bind: 方法进行封装,通过变量 skipped 来记录原始信号已经发过几个信号, 当skipped >= skipCount 的时候,会将信号事件直接发给最终订阅者

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"吃饭1"];
         [subscriber sendNext:@"完毕2"];
         [subscriber sendNext:@"上课3"];
         [subscriber sendNext:@"完毕4"];
         [subscriber sendCompleted];
         return nil;
     }];
     RACSignal *signal24 = [eat skip:2];
     [signal24 subscribeNext:^(id  _Nullable x) {
         NSLog(@"--%@",x);//上课3 完毕4
     }];

skipUntilBlock

和 -skip: 原理类似,忽略信号的条件从信号个数变化成从 predicate 闭包来判断,值得注意的是,当 predicate 闭包返回 YES 之后的所有信号就不再会被 skip block入参 是信号的序列

skipWhileBlock

与skipUntilBlock相反 只有 predicate 返回 YES 才skip 信号,一旦返回 NO,以后的信号就不再会被 skip

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         [subscriber sendNext:@3];
         [subscriber sendNext:@4];
         [subscriber sendNext:@0];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[sourceSignal skipUntilBlock:^BOOL(id  _Nullable x) {
         return [x integerValue] > 3;
     }] subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

take

当 taken 取到 count 个数的时候,就停止给订阅者发送信号。

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"吃饭1"];
         [subscriber sendNext:@"完毕2"];
         [subscriber sendNext:@"上课3"];
         [subscriber sendNext:@"完毕4"];
         [subscriber sendCompleted];
         return nil;
     }];
     RACSignal *signal24 = [eat take:2];
     [signal24 subscribeNext:^(id  _Nullable x) {
         NSLog(@"--%@",x);//吃饭1 完毕2
     }];

takeLast

先订阅原信号,根据参数 count, 保存最后 count 个信号值到数组 valuesTaken。当原信号发送 sendCompleted的时候遍历 valuesTaken 将其元素逐个发给订阅者

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         [subscriber sendNext:@3];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *takeSignal = [sourceSignal takeLast:2];
     
     [takeSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);//2  3
     }];

takeUntilBlock

是根据参数 predicate 闭包执行结果来判断是否给订阅者发送信号 知道block 条件成立才停止

 [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"1111"];
         [subscriber sendNext:@"2222"];
         [subscriber sendNext:@"3333"];
         [subscriber sendCompleted];
         return nil;
     }] takeUntilBlock:^BOOL(NSString * x) {
         if ([x isEqualToString:@"2222"]) {
             return YES;
         }
         return NO;
     }] subscribeNext:^(id  _Nullable x) {
         NSLog(@"%@",x);//1111
     }];
     

takeUntil

当takeUntil后的信号被触发之后,原有信号被销毁

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@3];
             [subscriber sendCompleted];
         });
         return [RACDisposable disposableWithBlock:^{
             NSLog(@"被销毁了吗?");
         }];
     }];
     
     RACSignal *untilSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@10];
             [subscriber sendCompleted];
         });
         return nil;
     }];
     
     RACSignal *takeSignal = [sourceSignal takeUntil:untilSignal];
     
     [takeSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];
     [untilSignal subscribeNext:^(id  _Nullable x) {
           NSLog(@"value = %@", x);
     }];

takeUntilReplacement

与takeUntil类似,当后面信号被触发时,前面的信号直接接管后面的信号传来的值

     RACSignal *signal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@3];
             [subscriber sendNext:@4];
             [subscriber sendCompleted];
         });
         return nil;
     }];
     
     RACSignal *signal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@5];
             [subscriber sendNext:@6];
             [subscriber sendCompleted];
         });
         return nil;
     }];
     
     RACSignal *newSignal = [signal1 takeUntilReplacement:signal2];
     [newSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

distinctUntilChanged

信号连续传来的数据是重复的,则忽略当前值

     [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"1111"];
         [subscriber sendNext:@"1111"];
         [subscriber sendNext:@"3333"];
         [subscriber sendNext:@"1111"];
         [subscriber sendCompleted];
         return nil;
     }] distinctUntilChanged] subscribeNext:^(id  _Nullable x) {
         NSLog(@"%@",x);///1111 3333 1111
     } completed:^{
         NSLog(@"nanananna");
     }];

groupBy:transform:

groupBy

主要是信号事件转化成类似 map 结构数据发给订阅者,主要逻辑可以概括为

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         [subscriber sendNext:@3];
         [subscriber sendNext:@4];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *groupSignal = [sourceSignal groupBy:^id<NSCopying> _Nullable(id  _Nullable object) {
         return [object integerValue] > 2 ? @"1" : @"2";
     } transform:^id _Nullable(id  _Nullable object) {
         return @([object integerValue] * 10);
     }];
     
     RACSignal *filterSignal = [[groupSignal filter:^BOOL(RACGroupedSignal *value) {
         return [(NSString *)value.key isEqualToString:@"1"];
     }] flatten];
     
     [filterSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

deliverOn:

当原信号发送 sendNext/sendError/sendCompleted 的时候,会根据传入的调度器 scheduler ,在对应的线程中把信号发给订阅者;换句话来说,就是通过传入 scheduler 指定对应线程接受信号

deliverOnMainThread

都放在主线程上执行

     RACSubject *signal = [RACSubject subject];
     [[signal retry] subscribeNext:^(id  _Nullable x) {
         NSLog(@"1-%@",x);
     }];
     [[signal deliverOn:[RACScheduler scheduler]] subscribeNext:^(id x) {
         NSLog(@"receiveSignal%@",[NSThread currentThread]);
     }];
     [signal subscribeNext:^(id  _Nullable x) {
           NSLog(@"%@",x);
       }];
     [signal sendNext:@1];

switch:case:default:

首先对参数 signal、case 做非空判断,然后遍历字典 case 并判断每一个 value 是否为 RACSignal 对象 订阅原信号进行 map 操作,根据 key 来从 case 里面取出对应的 RACSignal 并返回,如果取出来的是 nil,则取 defaultSignal,若 defaultSignal 为nil,则返回 error signal,这样原信号就被转化高阶信号,然后再进行 switchToLatest 操作,把最终的信号值发给订阅者

     RACSignal *signal0 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@"00"];
            return nil;
        }];
        
        RACSignal *signal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@"11"];
            return nil;
        }];
 ​
        RACSignal *defaultSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@1024];
            [subscriber sendCompleted];
            return nil;
        }];
        
        RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@"0"];
            [subscriber sendNext:@"1"];
            [subscriber sendNext:@"2"];
            [subscriber sendCompleted];
            return nil;
        }];
        NSDictionary *dict = @{@"0" : signal0,
                               @"1" : signal1,
                               };
        [[RACSignal switch:sourceSignal cases:dict default:defaultSignal] subscribeNext:^(id  _Nullable x) {
            NSLog(@"value = %@", x);
        }];

if: then: else:

+switch: cases: default: 原理类似,把原信号发送的布尔值通过 map 操作转化对应的 RACSignal 返回。YES->trueSignal, NO->falseSignal,

     RACSignal *signalTrue = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"true"];
         return nil;
     }];
     
     RACSignal *signalFalse = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"false"];
         return nil;
     }];
     
     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@(NO)];
         [subscriber sendNext:@(YES)];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[RACSignal if:sourceSignal then:signalTrue else:signalFalse] subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];;

catch:

当原信号发送 sendError 的时候把 error 传入 catchBlock 闭包并返回 RACSignal

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         NSError *error = [NSError errorWithDomain:@"" code:-1 userInfo:nil];
         [subscriber sendError:error];
         return nil;
     }];
     
     RACSignal *catchSignal = [sourceSignal catch:^RACSignal * _Nonnull(NSError * _Nonnull error) {
         NSLog(@"excute catch block, error = %@", error);
         return [RACSignal return:@"error text"];
     }];
     
     [catchSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

defer:

类方法 主要作用是延迟订阅,也就是在订阅前进行相关自定义的操作

      RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[RACSignal defer:^RACSignal * _Nonnull{
         NSLog(@"execute defer block");
         return sourceSignal;
     }] subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

initially

实例方法 与defer类似

      RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *initialSignal = [sourceSignal initially:^{
         NSLog(@"execute initial block");
     }];
     
     [initialSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

throttle

 - (RACSignal*)throttle:(NSTimeInterval)interval;

每次发送的数据,都经过interval的间隔之后才发出。在interval时间内发送的所有信号只有最后一个数据被发送,前面的都会被抛弃。

throttle:valuesPassingTest:

方法有2个参数: 时间间隔 interval 判断条件闭包 predicate

在规定时间内,凡是满足判断条件的信号值,只接受第一个

从原信号发出第一个信号(@0)发出开始计时,在 interval 秒内如果第二个信号(@1) 符合 predicate 的判断条件,则该前一个信号会被忽略;如果2个信号间隔时间超过 interval 秒或者不满足 predicate 判断,则前一个信号会发给订阅者。

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@0];
            [subscriber sendNext:@1];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                
                [subscriber sendNext:@2];
                [subscriber sendNext:@3];
                [subscriber sendCompleted];
            });
            return nil;
        }];
        
        RACSignal *throttleSignal = [sourceSignal throttle:1 valuesPassingTest:^BOOL(id  _Nullable next) {
            NSLog(@"-------%ld",(long)[next integerValue]);
            return [next integerValue] <= 2;
        }];
        [throttleSignal subscribeNext:^(id  _Nullable x) {
            NSLog(@"value = %@", x);
        }];

delay

方法是将原信号的信号事件延迟发送给订阅者

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         [subscriber sendNext:@3];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[sourceSignal delay:1] subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];
     
     NSLog(@"%@", [NSDate date]);

bufferWithTime:onScheduler:

一定时间内来的数据,打包成一组数据进行相应

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@2];
             [subscriber sendNext:@23];
             [subscriber sendNext:@3];
             dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                 [subscriber sendNext:@213];
                 [subscriber sendNext:@31];
                 [subscriber sendCompleted];
             });
         });
         return nil;
     }];
     NSLog(@"%@", [NSDate date]);
 ​
     RACSignal *bufferSignal = [sourceSignal bufferWithTime:1 onScheduler:[RACScheduler currentScheduler]];
     [bufferSignal subscribeNext:^(id  _Nullable x) {         NSLog(@"value = %@", x);     }];
     NSLog(@"%@", [NSDate date]);

timeout:onScheduler

判断从被订阅开始计时, interval 时间内如果原信号没有把所有信号发送完毕会给订阅者发送 error。

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@0];
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@3];
             [subscriber sendCompleted];
         });
         return nil;
     }];
     
     RACSignal *timeoutSig = [sourceSignal timeout:1 onScheduler:[RACScheduler currentScheduler]];
     [timeoutSig subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];
     
     [timeoutSig subscribeError:^(NSError * _Nullable error) {
         NSLog(@"error = %@", error);
     }];

interval:onScheduler:

定时器、多少秒执行一次,优先级多少?

 [[RACSignal interval:1 onScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityHigh]] subscribeNext:^(NSDate * _Nullable x) {
         NSLog(@"---%@",x);
 }];
     
 //---Mon Nov 23 11:28:27 2020
 //---Mon Nov 23 11:28:28 2020
 //---Mon Nov 23 11:28:29 2020

or

运算符,sendNext必须是RACTwoTuple、RACTuplePack等类型,包含值必须还NSNumbers类型,取出RACTwoTuple内存进行或操作,有1的1

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:RACTuplePack(@NO,@NO,@NO)];
         [subscriber sendNext:[RACTwoTuple pack:@12 :@0]];
 ​
         [subscriber sendCompleted];
         return nil;
     }];
 ​
     RACSignal *orSignal = [sourceSignal or];
     [orSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

any

感觉像是便利sendNext的数据,如果可以满足block里的条件返回YES sendNextde的数据只能是NSNumbers类型,NSString类型按照0算

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
 //        [subscriber sendNext:@"ssssss"];
         [subscriber sendNext:@4];
         [subscriber sendNext:@3];
         [subscriber sendNext:@2];
         [subscriber sendNext:@1];
         [subscriber sendNext:@0];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[sourceSignal any:^BOOL(id  _Nullable object) {
         NSLog(@"value111 = %ld", (long)[object integerValue]);
         return [object integerValue] < 2;
     }] subscribeNext:^(NSNumber * _Nullable x) {
         NSLog(@"value = %@", x);
     }];

all

和any类似,不过判断的是,所有内容是不是都满足这个条件,满足返回YES

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"ssssss"];
         [subscriber sendNext:@4];
         [subscriber sendNext:@3];
         [subscriber sendNext:@2];
         [subscriber sendNext:@1];
         [subscriber sendNext:@0];
         [subscriber sendNext:@5];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[sourceSignal all:^BOOL(id  _Nullable object) {
         NSLog(@"value111 = %ld", (long)[object integerValue]);
         return [object integerValue] < 5;
     }] subscribeNext:^(NSNumber * _Nullable x) {
         NSLog(@"value = %@", x);
     }];

repeat

源信号会循环被订阅触发其给订阅者发送 sendNext 事件,直到源信号发送 error 才结束

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@1];
 ​
         [subscriber sendCompleted];
         return nil;
     }];
 ​
     RACSignal *orSignal = [sourceSignal repeat];
     [orSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

retry

当遇到NSError 重试多少次

     RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         
         [subscriber sendError:[NSError errorWithDomain:@"domain" code:-1 userInfo:nil]];
         
         [subscriber sendNext:@3];
         
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *retrySignal = [sourceSignal retry:2];
     [retrySignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

combineLatestWith

原信号和参数信号合并成为一个新信号,2个信号都收到值打包成元组数据并发送给订阅者(每个信号都会保留和下一个信号合并打包),当分别收到过这俩个信号发送的信号值之后,不管原信号还是参数信号,以后每次发送 sendNext,都会将最新的2个信号值打包成元组数据发送给订阅者。

combineLatest

类方法 和combineLatestWith 一样

     RACSignal *signal0 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:@2];
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                 [subscriber sendNext:@41];
                 [subscriber sendCompleted];
             });
         return nil;
     }];
     
     RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:@3];
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                 [subscriber sendNext:@32];
                 [subscriber sendCompleted];
             });
         return nil;
     }];
     
     RACSignal *combineSig = [signal0 combineLatestWith:signal1];
     [combineSig subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];
     
 /**
 2020-11-23 11:33:13.840461+0800 Reactive_ RACSiganl[11298:1941520] value = <RACTwoTuple: 0x2825001f0> (
     2,
     3
 )
 2020-11-23 11:33:16.032234+0800 Reactive_ RACSiganl[11298:1941520] value = <RACTwoTuple: 0x28250c010> (
     41,
     3
 )
 2020-11-23 11:33:16.033008+0800 Reactive_ RACSiganl[11298:1941520] value = <RACTwoTuple: 0x28250c030> (
     41,
     32
 )
 */
     

combineLatest:reduce:

和combineLatest、combineLatestWith一样,会比前者多出一步,把两者的值处理生成新的信号。

打包之后,进行包信息处理,把处理之后的值返回给订阅者

 - (void)testCombineLatest {
     RACSignal *signal0 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:@11];
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@12];
             dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                 [subscriber sendNext:@13];
                 [subscriber sendCompleted];
             });
         });
         return nil;
     }];
     
     RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:@21];
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [subscriber sendNext:@22];
             dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                 [subscriber sendNext:@23];
                 [subscriber sendCompleted];
             });
         });
         return nil;
     }];
     
     RACSignal *combineSignal = [RACSignal combineLatest:@[signal0, signal1] reduce:^id _Nonnull (NSNumber *num1, NSNumber *num2) {
         return [RACTwoTuple pack:num1 :num2];
     }];
     
     [combineSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];
 }
 ​
 /**
 2020-11-23 11:39:56.661618+0800 Reactive_ RACSiganl[11313:1944095] value = <RACTwoTuple: 0x281fd89a0> (
     11,
     21
 )
 2020-11-23 11:39:58.858035+0800 Reactive_ RACSiganl[11313:1944095] value = <RACTwoTuple: 0x281fd00b0> (
     12,
     21
 )
 2020-11-23 11:39:58.858989+0800 Reactive_ RACSiganl[11313:1944095] value = <RACTwoTuple: 0x281fd0080> (
     12,
     22
 )
 2020-11-23 11:40:01.057835+0800 Reactive_ RACSiganl[11313:1944095] value = <RACTwoTuple: 0x281fd00d0> (
     13,
     22
 )
 2020-11-23 11:40:01.058529+0800 Reactive_ RACSiganl[11313:1944095] value = <RACTwoTuple: 0x281fd0040> (
     13,
     23
 )
 ​
 */

scanWithStart:reduce:

scanWithStart:reduceWithIndex

running初始值或者reduce的返回值,next下一个值,index 序列号

     RACSignal *eat = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         [subscriber sendNext:@"1111"];
         [subscriber sendNext:@"2222"];
         [subscriber sendNext:@"3333"];
         [subscriber sendCompleted];
         return nil;
     }];
     
     [[eat scanWithStart:@"0" reduce:^id _Nullable(id  _Nullable running, id  _Nullable next) {
         NSLog(@"%@",running);
         NSLog(@"-%@",next);
         return next;
     }] subscribeNext:^(id  _Nullable x) {
         NSLog(@"=%@",x);
     }];
     
     [[eat scanWithStart:@"0" reduceWithIndex:^id _Nullable(id  _Nullable running, id  _Nullable next, NSUInteger index) {
         return [NSString stringWithFormat:@"%@%@-%lu",running,next,(unsigned long)index];
     }] subscribeNext:^(id  _Nullable x) {
         NSLog(@"%@",x);// 01111-0  01111-02222-1   01111-02222-13333-2
     }];

combinePreviousWithStart:reduce:

current当前值,previous下一个sendNext值

     RACSignal *signal0 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
         [subscriber sendNext:@1];
         [subscriber sendNext:@2];
         [subscriber sendNext:@3];
         [subscriber sendCompleted];
         return nil;
     }];
     
     RACSignal *combineSignal = [signal0 combinePreviousWithStart:@100 reduce:^id _Nullable(NSNumber *  _Nullable previous, NSNumber *  _Nullable current) {
         return @(previous.integerValue + current.integerValue);
     }];
     
     [combineSignal subscribeNext:^(id  _Nullable x) {
         NSLog(@"value = %@", x);
     }];

方法链接

blog.csdn.net/jianghui121…