美文网首页
iOS RAC - 过滤

iOS RAC - 过滤

作者: Codepgq | 来源:发表于2017-10-28 10:31 被阅读1148次

    文章系列
    《RACSignal 》
    《RACDisposable》
    《RACSubject、RACReplaySubject》
    《iOS RAC - 基本用法》
    《iOS RAC - 定时器》
    《iOS RAC - RACMulticastConnection》
    《iOS RAC - RACCommand》
    《iOS RAC - 核心方法bind》
    《iOS RAC - 集合RACTuple、RACSequence》
    《iOS RAC - rac_leftSelector》
    《iOS RAC - 映射》
    《iOS RAC - 过滤》
    《iOS RAC - 登录页面,MVVM》



    git地址

    fillter 过滤

    过滤,顾名思义自然是过滤掉我们不想要的数据,在RAC中则是过滤掉不想要的信号。
    举个例子,过滤掉textField前面五个字符
    现在模拟一下情况。

    1、搭建UI

    UI

    使用fillter

        [self.textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
            <#code#>
        }];
    



    可以看到使用fillter会让我们返回一个BOOL变量,当BOOL为true的使用才会返回信号,否则就过滤掉了。
    所以我们就可以这样子写:

        [[self.textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
            return value.length > 5;
        }] subscribeNext:^(NSString * _Nullable x) {
            NSLog(@"%@",x);
        }];
    



    运行结果

    输入
    确实过滤掉了这个当长度小于6的信号
    ignore 忽略

    现在忽略掉值为 a 的信号

        RACSubject * subject = [RACSubject subject];
        
        [[subject ignore:@"a"] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"a"];
        [subject sendNext:@"a1"];
        [subject sendNext:@"b"];
    
    ignore
    ignoreValues 忽略掉所有的值
        RACSubject * subject = [RACSubject subject];
        
        [[subject ignoreValues] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"a"];
        [subject sendNext:@"a1"];
        [subject sendNext:@"b"];
    
    ignoreValues
    ignoreValues 忽略掉所有的值
        RACSubject * subject = [RACSubject subject];
        
        [[subject ignoreValues] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"a"];
        [subject sendNext:@"a1"];
        [subject sendNext:@"b"];
    
    ignoreValues
    ignore 忽略掉某些的值

    假设要忽略掉 1 2 3 4

        RACSubject * subject = [RACSubject subject];
        
        [[[[[subject ignore:@"1"] ignore:@"2"] ignore:@"3"] ignore:@"4"] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        [subject sendNext:@"3"];
        [subject sendNext:@"4"];
        [subject sendNext:@"5"];
    
    image.png
    take 指定哪些信号 正序
        RACSubject * subject = [RACSubject subject];
        
        [[subject take:1] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        [subject sendNext:@"3"];
        [subject sendNext:@"4"];
        [subject sendNext:@"5"];
    
    take
    take 指定哪些信号 倒序
        RACSubject * subject = [RACSubject subject];
        
        [[subject takeLast:1] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        [subject sendNext:@"3"];
        [subject sendNext:@"4"];
        [subject sendNext:@"5"];
    
        [subject sendCompleted];
    

    这里有一点要值得注意,期末会考,重点 重点 重点

    在使用takeLast的使用一定要告诉系统,发送完成了,不然就没效果。

    其实想想也很正常,你都不告诉我结束了没,我怎么倒着给你取?

    takeLast
    takeUntil 标记

    takeUntil需要一个信号作为标记,当标记的信号发送数据,就停止。

        RACSubject * subject = [RACSubject subject];
        RACSubject * subject1 = [RACSubject subject];
        
        [[subject takeUntil:subject1] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject1 subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"1"];
        [subject sendNext:@"2"];
        [subject sendNext:@"3"];
        
        [subject1 sendNext:@"Stop"];
        
        [subject sendNext:@"4"];
        [subject sendNext:@"5"];
    
    takeUntil
    distinctUntilChanged 剔除一样的信号
        RACSubject * subject = [RACSubject subject];
        
        [[subject distinctUntilChanged] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@"x"];
        [subject sendNext:@"x"];
        [subject sendNext:@"x"];
    
    字符串

    还可以忽略掉数组、字典,但是不可以忽略模型

        RACSubject * subject = [RACSubject subject];
        
        [[subject distinctUntilChanged] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        [subject sendNext:@[@1]];
        [subject sendNext:@[@1]];
        
        [subject sendNext:@{@"name":@"jack"}];
        [subject sendNext:@{@"name":@"jack"}];
        
        Person * p1 = [[Person alloc] init];
        p1.name = @"jj";
        p1.age = 20;
        
        Person * p2 = [[Person alloc] init];
        p2.name = @"jj";
        p2.age = 20;
        
        [subject sendNext:p1];
        [subject sendNext:p2];
    
    忽略

    相关文章

      网友评论

          本文标题:iOS RAC - 过滤

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