rac2

作者: ios_stand | 来源:发表于2017-04-27 11:27 被阅读0次

    ReactiveCocoa操作方法之映射(flattenMap,Map)
    flattenMap,Map用于把源信号内容映射成新的内容。

    map简单使用:

    RACSubject *subject = [RACSubject subject];
        
        RACSignal *bindSignal = [subject map:^id(id value) {
            
            return [NSString stringWithFormat:@"SWL:%@",value];
            
        }];
        
        [bindSignal subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"111"];
    

    flattenMap简单使用:

    RACSubject *signalOfSignal = [RACSubject subject];
        
        RACSubject *signal = [RACSubject subject];
        //方式一
    //    [signalOfSignal subscribeNext:^(RACSignal *x) {
    //        [x subscribeNext:^(id x) {
    //            NSLog(@"%@",x);
    //        }];
    //    }];
        //方式二
    //    [[signalOfSignal switchToLatest]subscribeNext:^(id x) {
    //        NSLog(@"%@",x);
    //    }];
        //方式三
        [[signalOfSignal flattenMap:^RACStream *(id value) {
            return value;
        }]subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
       
        [signalOfSignal sendNext:signal];
        [signal sendNext:@"111"];
    

    signalOfsignals用FlatternMap

    FlatternMap和Map的区别

    1.FlatternMap中的Block返回信号。
    2.Map中的Block返回对象。
    3.开发中,如果信号发出的值不是信号,映射一般使用Map
    4.开发中,如果信号发出的值是信号,映射一般使用FlatternMap。

    ReactiveCocoa操作方法之组合

    concat:按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            //伪代码:发送顶部请求
            [subscriber sendNext:@"顶部数据"];
            [subscriber sendCompleted];
            return nil;
        }];
        
        RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            //伪代码:发送底部请求
            [subscriber sendNext:@"底部数据"];
            return nil;
        }];
        //创建组合信号 关键字concat:按顺序去连接
        //注意:第一个信号一定要调用sendCompleted
        RACSignal *concatSignal = [signalA concat:signalB];
        //订阅组合信号
        [concatSignal subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
    }
    

    then:用于连接两个信号,当第一个信号完成,才会连接then返回的信号。(会忽略第一个信号的所有值)

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            //伪代码:发送顶部请求
            [subscriber sendNext:@"顶部数据"];
            [subscriber sendCompleted];
            return nil;
        }];
        
        RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            //伪代码:发送底部请求
            [subscriber sendNext:@"底部数据"];
            return nil;
        }];
        
        //创建组合信号
        //then:忽略掉第一个信号所有值
        RACSignal *thenSignal = [signalA then:^RACSignal *{
            //返回信号就是需要组合的信号
            return signalB;
        }];
        
        //订阅信号
        [thenSignal subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
    }
    

    merge:把多个信号合并为一个信号,任何一个信号有新值的时候就会调用

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        RACSubject *signalA = [RACSubject subject];
        RACSubject *signalB = [RACSubject subject];
        //创建组合信号
        RACSignal *mergeSignal = [signalA merge:signalB];
        //订阅组合信号
        [mergeSignal subscribeNext:^(id x) {
            //任意一个信号发送内容都会来这个block
            NSLog(@"%@",x);
        }];
        //发送
        [signalA sendNext:@"111"];
        [signalB sendNext:@"222"];
    }
    
    

    zipWith:把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元组,才会触发压缩流的next事件。

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        RACSubject *signalA = [RACSubject subject];
        RACSubject *signalB = [RACSubject subject];
        
        //压缩成一个信号
        //zipWith:当一个界面多个请求的时候,要等所有请求完成才能更新ui
        RACSignal *zipSignal = [signalA zipWith:signalB];
        [zipSignal subscribeNext:^(id x) {
            //zipWith:等所有信号都发送内容的时候才调用
            NSLog(@"%@",x);
        }];
        
        [signalB sendNext:@"2"];
        [signalA sendNext:@"1"];
        //打印结果:
        //<RACTuple: 0x6000000077c0> (
        //1,
        //2
        //)
    }
    

    combineLatest reduce先组合在聚合:

    
    - (void)viewDidLoad {
        //需求:登陆账号和密码都有值,登陆按钮可点
        [super viewDidLoad];
        //先组合 在聚合
        //combineLatest:组合哪些信号  reduce:聚合
        RACSignal *combineSignal = [RACSignal combineLatest:@[[_accountField rac_textSignal],[_passwordField rac_textSignal]] reduce:^id(NSString *account,NSString *password){//block的参数和组合的信号一一对应
            //聚合的值就是组合信号的内容
            //block调用时刻:只要源信号发送内容就回调用
            return @(account.length && password.length);
        }];
        
    //    [combineSignal subscribeNext:^(id x) {
    //        _loginButton.enabled = [x boolValue];
    //    }];
        RAC(_loginButton,enabled) = combineSignal;
    }
    

    ReactiveCocoa操作方法之过滤

    filter:过滤信号,使用它可以获取满足条件的信号.

    - (void)viewDidLoad {
        [super viewDidLoad];
        //只有当文本框内容长度大于5,才获取文本框的内容
        [[[_accountField rac_textSignal]filter:^BOOL(id value) {
            //value:源信号的内容
            //返回值:就是过滤条件,只有满足这个条件,才能获取到内容
            return [value length] > 5;
        }]subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
    }
    

    ignore:忽略完某些值的信号.

    - (void)viewDidLoad {
        [super viewDidLoad];
        RACSubject *subject = [RACSubject subject];
        RACSignal *ignoreSignal = [subject ignore:@"1"];
        //ignoreValues:忽略所有值
    //    RACSignal *ignoreSignal = [subject ignoreValues];
        [ignoreSignal subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        //打印结果:2
    }
    

    take:从开始一共取N次的信号

    - (void)viewDidLoad {
        [super viewDidLoad];
        RACSubject *subject = [RACSubject subject];
        [[subject take:1]subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        //打印结果:1
    }
    

    takeLast:取最后N次的信号,前提条件,订阅者必须调用完成,因为只有完成,就知道总共有多少信号.

    - (void)viewDidLoad {
        [super viewDidLoad];
        RACSubject *subject = [RACSubject subject];
        //takeLast:取后面多少个值,必须要发送完成
        [[subject takeLast:2]subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        [subject sendNext:@"3"];
        [subject sendCompleted];
        //打印结果:2 3
    }
    

    takeUntil:只要传入信号发送完成或者发送任意数据,就不会在接受源信号的内容

    - (void)viewDidLoad {
        [super viewDidLoad];
        RACSubject *subject = [RACSubject subject];
        RACSubject *signal = [RACSubject subject];
        [[subject takeUntil:signal]subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        [subject sendNext:@"1"];
    
        [signal sendCompleted];
        //[signal sendNext:@"a"];
    
        [subject sendNext:@"2"];
        [subject sendNext:@"3"];
        //打印结果:1
    }
    

    distinctUntilChanged:当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉。

    - (void)viewDidLoad {
        [super viewDidLoad];
        RACSubject *subject = [RACSubject subject];
        [[subject distinctUntilChanged]subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        [subject sendNext:@"1"];
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        //打印结果:1 2
    }
    

    skip:(NSUInteger):跳过几个信号,不接受。

    - (void)viewDidLoad {
        [super viewDidLoad];
        RACSubject *subject = [RACSubject subject];
        [[subject skip:2]subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        [subject sendNext:@"3"];
        //打印结果:3
    }
    

    相关文章

      网友评论

          本文标题:rac2

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