文章系列
《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》
fillter
过滤
过滤,顾名思义自然是过滤掉我们不想要的数据,在RAC中则是过滤掉不想要的信号。
举个例子,过滤掉textField
前面五个字符
现在模拟一下情况。
1、搭建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"];
ignoreValues
忽略掉所有的值
RACSubject * subject = [RACSubject subject];
[[subject ignoreValues] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"a"];
[subject sendNext:@"a1"];
[subject sendNext:@"b"];
ignoreValues
忽略掉所有的值
RACSubject * subject = [RACSubject subject];
[[subject ignoreValues] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"a"];
[subject sendNext:@"a1"];
[subject sendNext:@"b"];
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"];
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
指定哪些信号 倒序
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
的使用一定要告诉系统,发送完成了,不然就没效果。
其实想想也很正常,你都不告诉我结束了没,我怎么倒着给你取?
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"];
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];