上一篇文章简要说明了映射的使用方法,这次介绍一下信号过滤。 信号过滤,在RAC中会对RACSignal信号发送的信息进行过滤,只有符合判断要求的信号才能被订阅到。 信号过滤有以下几种方法:filter、ignore、ignoreValue、distinctUntilChanged
filter方法: 在filter的block代码块中,通过return一个BOOL值来判断是否过滤掉信号。直接上代码
@weakify(self);
[[self.testTextField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
//过滤判断条件
@strongify(self)
if (self.testTextField.text.length >= 6) {
self.testTextField.text = [self.testTextField.text substringToIndex:6];
self.testLable.text = @"已经到6位了";
self.testLable.textColor = [UIColor redColor];
}
return value.length <= 6;
}] subscribeNext:^(NSString * _Nullable x) {
//订阅逻辑区域
NSLog(@"filter过滤后的订阅内容:%@",x);
}];
以上代码实现效果如下图:  {
//将self.testTextField的所有textSignal全部过滤掉
}];
[[self.testTextField.rac_textSignal ignore:@"1"] subscribeNext:^(id _Nullable x) {
//将self.testTextField的textSignal中字符串为指定条件的信号过滤掉
}];
ignoreValue方法实现
ignore方法实现
distinctUntilChanged 用于判断当前信号的值跟上一次的值相同,若相同时将不会收到订阅信号。
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@1111];
[subject sendNext:@2222];
[subject sendNext:@2222];
打印结果
可以发现上述代码执行时,当第二次发送一条@2222的信号时,并没有订阅打印出相关结果。
distinctUntilChanged实现方法
上图为distinctUntilChanged方法实现,通过判断是否为指定的字符串值,当符合条件时,将信号变换为空信号,此时则不会接收到订阅信号。
文章中的代码已上传至GitHub,可从此处链接下载demo链接