RAC中常见的高级用法-过滤

2016-08-15  本文已影响440人  傻傻小萝卜

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"];

上一篇下一篇

猜你喜欢

热点阅读