美文网首页
[iOS][RAC]--组合、过滤

[iOS][RAC]--组合、过滤

作者: 阿不不不不 | 来源:发表于2018-11-05 21:08 被阅读8次

组合

一、concat

按顺序组合发送信号 注意:每当一个信号发送结束后需执行完成发送方法才能进行下一个信号的发送
//组合!!
    //创建信号!!
    RACSignal * signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        NSLog(@"发送请求A");
        //发送数据
        [subscriber sendNext:@"数据A"];
        //注意:每当一个信号发送结束后需执行完成发送方法才能进行下一个信号的发送
        [subscriber sendCompleted];
        
        return nil;
    }];
    
    RACSignal * signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        NSLog(@"发送请求B");
        //发送数据
        [subscriber sendNext:@"数据B"];
        [subscriber sendCompleted];
        return nil;
    }];
    
    RACSignal * signalC = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        NSLog(@"发送请求C");
        //发送数据
        [subscriber sendNext:@"数据C"];
        
        return nil;
    }];
    
    //concat:按顺序组合!!
    //创建组合信号!!
    RACSignal * concatSignal = [RACSignal concat:@[signalA,signalB,signalC]];
    
    //订阅组合信号
    [concatSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
Snip20181105_23.png

二、then

忽略掉第一个信号所有的值
 //创建信号!!
    RACSignal * signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        NSLog(@"发送请求A");
        //发送数据
        [subscriber sendNext:@"数据A"];
        [subscriber sendCompleted];
        
        return nil;
    }];
    
    RACSignal * signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        NSLog(@"发送请求B");
        //发送数据
        [subscriber sendNext:@"数据B"];
        [subscriber sendCompleted];
        return nil;
    }];
    
    //then:忽略掉第一个信号所有的值!!
    RACSignal * thenSignal = [signalA then:^RACSignal * _Nonnull{
        return signalB;
    }];
    
    //订阅信号
    [thenSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
Snip20181105_24.png

三、merge

根据发送的情况接受数据:当多个信号时谁先发送完成谁就会被先接收到数据
//创建信号
    RACSubject * signalA = [RACSubject subject];
    RACSubject * signalB = [RACSubject subject];
    RACSubject * signalC = [RACSubject subject];
    
    //组合信号
    RACSignal * mergeSignal = [RACSignal merge:@[signalA,signalB,signalC]];
    
    //订阅 -- 根据发送的情况接受数据!!
    [mergeSignal subscribeNext:^(id  _Nullable x) {
        //任意一二信号发送内容就会来这个Block
        NSLog(@"%@",x);
    }];
    
    //发送数据
    [signalC sendNext:@"数据C"];
    [signalA sendNext:@"数据A"];
    [signalB sendNext:@"数据B"];
Snip20181106_25.png

四、combineLatest:将combineLatest:后面的数组中的信合打包成为一个新的信号。只有当数组中信号都成功发送过信号的时候打包后的信号才能正常执行订阅后的代码块。

//组合
    //reduceBlock参数:根据组合的信号关联的  必须 一一对应!!
    RACSignal * signal = [RACSignal combineLatest:@[_accountFiled.rac_textSignal,_pwdFiled.rac_textSignal] reduce:^id _Nullable(NSString * account,NSString * pwd){
        //两个文本框的text是否有值!!
        return @(account.length && pwd.length);
    }];
    
    RAC(_loginBtn,enabled) = signal;
Snip20181106_37.png

注意:combineLatest和merge的区别:前者是数组中信号都成功发送过信号的时候打包后的信号才能正常执行订阅后的代码块,后者是任意一个信号发送成功就可以正常执行订阅后的代码

五、zipWith:两个信号压缩!只有当两个信号同时发出信号内容,并且将内容合并成为一个元祖给你

//zipWith:两个信号压缩!只有当两个信号同时发出信号内容,并且将内容合并成为一个元祖给你
    //创建信号
    RACSubject * signalA = [RACSubject subject];
    RACSubject * signalB = [RACSubject subject];
    
    //压缩
    RACSignal * zipSignal =  [signalA zipWith:signalB];
    
    //接受数据  和发送顺序无关!!
    [zipSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    //发送数据
    [signalB sendNext:@"B" ];
    [signalA sendNext:@"A" ];
    [signalB sendNext:@"B1"];
    [signalA sendNext:@"A1"];
    [signalB sendNext:@"B2"];
    [signalA sendNext:@"A2"];
Snip20181106_26.png
Snip20181106_27.png

过滤

一、filter:就是过滤条件,只有满足这个条件,才能获取到内容

[[_textfiled.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        //value:源信号的内容
        return [value length] > 5;
        //返回值:就是过滤条件,只有满足这个条件,才能获取到内容
    }] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"%@",x);
    }];
Snip20181106_28.png

二、ignore:忽略一些值(指定值)

//ignore:忽略
    RACSubject * subject = [RACSubject subject];
    
    //忽略一些值!!
    RACSignal * ignoreSignal = [[[subject ignore:@"1"] ignore:@"2"] ignore:@"3"];
    
    //订阅
    [ignoreSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    //发送数据
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"13"];
    [subject sendNext:@"3"];
Snip20181106_29.png

三、1、take:指定拿前面的哪几条数据!!(从前往后)

RACSubject * subject = [RACSubject subject];
    //take:指定拿前面的哪几条数据!!(从前往后)
    //takeLast:指定拿前面的哪几条数据!!(从后往前)注意点:一定要写结束!!
    [[subject take:2] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendNext:@"1"];
    [subject sendCompleted];
Snip20181106_31.png

2、takeLast:指定拿前面的哪几条数据!!(从后往前)注意点:一定要写结束!!

RACSubject * subject = [RACSubject subject];
    //take:指定拿前面的哪几条数据!!(从前往后)
    //takeLast:指定拿前面的哪几条数据!!(从后往前)注意点:一定要写结束!!
    [[subject takeLast:2] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendNext:@"1"];
    [subject sendCompleted];
Snip20181106_32.png

3、takeUntil:直到你的标记信号发送数据的时候结束

RACSubject * subject = [RACSubject subject];
    [[subject takeLast:2] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendNext:@"1"];
    [subject sendCompleted];
    
    //专门做一个标记信号!!
    RACSubject * signal = [RACSubject subject];
    //take:指定拿前面的哪几条数据!!(从前往后)
    //takeLast:指定拿前面的哪几条数据!!(从后往前)注意点:一定要写结束!!
    //takeUntil:直到你的标记信号发送数据的时候结束!!!
    [[subject takeUntil:signal] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

    [subject sendNext:@"2"];
    [signal sendCompleted];//标记信号!!
    [subject sendNext:@"3"];
    [subject sendNext:@"1"];
    [subject sendCompleted];
Snip20181106_34.png

四、distinctUntilChanged:忽略重复数据

//1.创建信号
    RACSubject * subject = [RACSubject subject];
    
    //忽略掉重复数据
    [[subject distinctUntilChanged] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    //请求回来
    [subject sendNext:@"hmp"];
    [subject sendNext:@"hmp"];
    [subject sendNext:@"hmp ff"];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"2"];
Snip20181106_35.png

五、跳跃几个值

RACSubject * subject = [RACSubject subject];

    //skip: 跳跃几个值
    [[subject skip:2] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
Snip20181106_36.png

相关文章

  • [iOS][RAC]--组合、过滤

    组合 一、concat 按顺序组合发送信号 注意:每当一个信号发送结束后需执行完成发送方法才能进行下一个信号的发送...

  • RAC(三)

    本demo详见github 1.RAC过滤 2.RAC映射 3.RAC组合 4.RACBind 友情链接: RAC...

  • iOS RAC - 过滤

    文章系列《RACSignal 》《RACDisposable》《RACSubject、RACReplaySubje...

  • RAC信号组合

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

  • ReactiveCocoa的进阶

    信号的生命周期 1.RAC高阶函数 2.隐射 flattenMap 3.过滤(filter) 4.组合(combi...

  • (一)、iOS RAC - RACSignal

    (一)、iOS RAC - RACSignal (二)、iOS RAC - RACDisposable(三...

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

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

  • IOS RAC实践

    前言 RAC使用-->IOS RAC使用 -- ReactiveObjC 本文使用RAC+MVVM来模拟用户登录 ...

  • RAC 组合 then

    RACSignal *signalA = [RACSignal createSignal:^RACDisposa...

  • RAC组合

    concat 组合 按一定顺序执行 如我们处理网络请求时遇到先得到一个网络的返回再去请求另一个网络 相当于必须先执...

网友评论

      本文标题:[iOS][RAC]--组合、过滤

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