iOS RAC - 过滤

2017-10-28  本文已影响1148人  Codepgq

文章系列
《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];
忽略
上一篇 下一篇

猜你喜欢

热点阅读