flattenMap
把源信号的内容映射成一个新的信号,信号可以是任意类型.使用方式,如下面的代码,我们可以把txtfeild的输入的内容重新组装成新的内容
[[self.textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
NSString *outStr = [NSString stringWithFormat:@"输出:%@",value];
return [RACReturnSignal return:outStr];
}]subscribeNext:^(id _Nullable x) {
NSLog(@"subscribeNex:%@",x);
}] ;
filter
顾名思义,这个可以过滤一些不满足条件的信号
@weakify(self)
RACSignal *signal = [self.textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
@strongify(self)
if (self.textField.text.length>8) {
self.textField.text = [self.textField.text substringToIndex:8];
}
NSLog(@"value == %@",value);
return value.length<8;
}];
[signal subscribeNext:^(id _Nullable x) {
self.textField.text = x;
NSLog(@"x== %@",x);
}];
单文本输入字符串的长度大于8时,可与过滤掉
ignore
表示可以忽略某些信号
[[self.textField.rac_textSignal ignore:@"a"] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
skip
[[self.textField.rac_textSignal skip:1] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
表示输入第一次,不会被监听到,跳过第一次发出的信号
combineLatestWith
将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的signal至少都有过一次sendNext,才会触发合并的信号
RACSignal *signalA = self.textField.rac_textSignal;
RACSignal *signalB = [self.button rac_signalForControlEvents:UIControlEventTouchUpInside];
// 合并信号,任何一个信号发送数据,都能监听到.
RACSignal *comSignal = [signalA combineLatestWith:signalB];
[comSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
reduce
通过这个函数我们对不满足条件的信号可以去掉
RACSignal *signalA = self.textField.rac_textSignal;
RACSignal *signalB = [self.button rac_signalForControlEvents:UIControlEventTouchUpInside];
@weakify(self)
RACSignal *reduceSignal = [RACSignal combineLatest:@[signalA,signalB] reduce:^(id value1, id value2){
@strongify(self)
if (self.textField.text.length >8) {
return [NSString stringWithFormat:@"reduce == %@",value1];
}else{
return [NSString stringWithFormat:@"reduce == %@ %@",value1,value2];
}
}];
[reduceSignal subscribeNext:^(id _Nullable x) {
NSLog(@"subscribeNext == %@",x);
}];
distinctUntilChanged
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 发送信号
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@2];
当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉。
takeUntil
RACSubject *subject = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
[[subject takeUntil:subject2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 发送信号
[subject sendNext:@1];
[subject sendNext:@2];
// [subject2 sendNext:@3]; // 1
// [subject2 sendCompleted]; // 或2
[subject sendNext:@4];
给takeUntil传的是哪个信号,那么当这个信号发送信号或sendCompleted,就不能再接受源信号的内容了
takeLast
takeLast:和take的用法一样,不过它取的是最后的几个值,如下,则取的是最后两个值
注意点:takeLast 一定要调用sendCompleted,告诉他发送完成了,这样才能取到最后的几个值
RACSubject *subject = [RACSubject subject];
[[subject takeLast:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 发送信号
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
[subject sendCompleted];
网友评论