RAC中常见的高级用法-过滤
filter
过滤信号,使用它可以获取满足条件的信号.
//只用当文本框的长度大于11才是想要获取的文本的内容
[[self.useNameTextField.rac_textSignal filter:^BOOL(idvalue) {//这里只用返回Yes,才会走下面的方法subscribeNext,返回NO是不会走下面的
// value:源信号的内容
NSString*text = (NSString*)value;
if(text.length>11) {
return YES;
}else{
return NO;
}
//返回值就是过滤的条件,只有满足这个条件才会能够获取到内容
}]
// 订阅信号,满足上面的条件,即可执行这里面的方法
subscribeNext:^(idx) {
NSLog(@"%@",x);
self.passWordTextField.backgroundColor= [UIColor greenColor];
}];
ignore:
忽略完某些值的信号.
//创建信号
RACSubject*signal = [RACSubject subject];
//ignore是忽略一些值
//ignoreVlaues忽略所有的值
RACSignal*ignoreSignal = [signal ignore:@"luobo"];
//RACSignal *ignoreSignal = [signal ignoreValues];
//订阅信号
[ignoreSignal subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
//发送信号
[signal sendNext:@"luobo"];
[signal sendNext:@"crazy"];
distinctUntilChanged:
当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉。
在开发中,刷新UI经常使用,只有两次数据不一样才需要刷新
//创建信号
RACSubject*signal = [RACSubject subject];
//调用方法后订阅信号
[[signal distinctUntilChanged] subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
//相当于上面
//RACSignal *distinSignal = [signal distinctUntilChanged];
//[distinSignal subscribeNext:^(id x) {
//NSLog(@"%@",x);
//
//}];
[signal sendNext:@"luobo"];
[signal sendNext:@"luobo"];
[signal sendNext:@"luobo"];
[signal sendNext:@"luo"];
take:
从开始一共取N次的信号
//创建信号
RACSubject*subject = [RACSubject subject];
RACSubject*signal = [RACSubject subject];
// take是取前面的几个值
//订阅信号
[[subject take:2] subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
// takeLast:去后面的多少个值,必须是发送完的
//只有调用[subject sendCompleted];才会发送信号
[[subject takeLast:2]subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
// takeUntil:只要是传入的信号发送完成或者是signal发送信号,就不会接收信号的内容
[[signal takeUntil:signal] subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
//发送数据
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
[subject sendCompleted];
[signal sendNext:@"signal"];
- (RACSignal *)rac_textSignal {
@weakify(self);
return[[[[[RACSignal
concat:[self rac_signalForControlEvents:UIControlEventEditingChanged]]
map:^(UITextField *x) {
returnx.text;
}]
takeUntil:self.rac_willDeallocSignal]// bingo!
}
switchToLatest:
用于signalOfSignals(信号的信号),有时候信号也会发出信号,会在signalOfSignals中,获取signalOfSignals发送的最新信号
//创建信号
RACSubject*signalOfSignal = [RACSubjectsubject];
RACSubject*signal = [RACSubjectsubject];
//获取信号中信号最近发出的信号,订阅最近发出的信号
//注意switchToLatest只能用于信号中的信号
[signalOfSignal.switchToLatestsubscribeNext:^(idx) {
NSLog(@"%@",x);
}];
[signalOfSignalsendNext:signal];// 将信号变为信号中的信号
[signalsendNext:@"signal"];
skip
跳过几个信号,不接受
//skip:跳跃几个值再接收被订阅
//创建信号
RACSubject*subject = [RACSubject subject];
[[subjectskip:2] subscribeNext:^(idx) {//跳跃过两个,执行下面的几个
NSLog(@"%@", x);
}];
[subject sendNext:@"LUO"];
[subject sendNext:@"1"];
[subject sendNext:@"3"];
[subject sendNext:@"4"];