ReactiveCocoa操作方法之映射(flattenMap,Map)
flattenMap,Map用于把源信号内容映射成新的内容。
map简单使用:
RACSubject *subject = [RACSubject subject];
RACSignal *bindSignal = [subject map:^id(id value) {
return [NSString stringWithFormat:@"SWL:%@",value];
}];
[bindSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"111"];
flattenMap简单使用:
RACSubject *signalOfSignal = [RACSubject subject];
RACSubject *signal = [RACSubject subject];
//方式一
// [signalOfSignal subscribeNext:^(RACSignal *x) {
// [x subscribeNext:^(id x) {
// NSLog(@"%@",x);
// }];
// }];
//方式二
// [[signalOfSignal switchToLatest]subscribeNext:^(id x) {
// NSLog(@"%@",x);
// }];
//方式三
[[signalOfSignal flattenMap:^RACStream *(id value) {
return value;
}]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[signalOfSignal sendNext:signal];
[signal sendNext:@"111"];
signalOfsignals用FlatternMap
FlatternMap和Map的区别
1.FlatternMap中的Block返回信号。
2.Map中的Block返回对象。
3.开发中,如果信号发出的值不是信号,映射一般使用Map
4.开发中,如果信号发出的值是信号,映射一般使用FlatternMap。
ReactiveCocoa操作方法之组合
concat:按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号
- (void)viewDidLoad {
[super viewDidLoad];
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id subscriber) {
//伪代码:发送顶部请求
[subscriber sendNext:@"顶部数据"];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id subscriber) {
//伪代码:发送底部请求
[subscriber sendNext:@"底部数据"];
return nil;
}];
//创建组合信号 关键字concat:按顺序去连接
//注意:第一个信号一定要调用sendCompleted
RACSignal *concatSignal = [signalA concat:signalB];
//订阅组合信号
[concatSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
then:用于连接两个信号,当第一个信号完成,才会连接then返回的信号。(会忽略第一个信号的所有值)
- (void)viewDidLoad {
[super viewDidLoad];
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id subscriber) {
//伪代码:发送顶部请求
[subscriber sendNext:@"顶部数据"];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id subscriber) {
//伪代码:发送底部请求
[subscriber sendNext:@"底部数据"];
return nil;
}];
//创建组合信号
//then:忽略掉第一个信号所有值
RACSignal *thenSignal = [signalA then:^RACSignal *{
//返回信号就是需要组合的信号
return signalB;
}];
//订阅信号
[thenSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
merge:把多个信号合并为一个信号,任何一个信号有新值的时候就会调用
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *signalA = [RACSubject subject];
RACSubject *signalB = [RACSubject subject];
//创建组合信号
RACSignal *mergeSignal = [signalA merge:signalB];
//订阅组合信号
[mergeSignal subscribeNext:^(id x) {
//任意一个信号发送内容都会来这个block
NSLog(@"%@",x);
}];
//发送
[signalA sendNext:@"111"];
[signalB sendNext:@"222"];
}
zipWith:把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元组,才会触发压缩流的next事件。
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *signalA = [RACSubject subject];
RACSubject *signalB = [RACSubject subject];
//压缩成一个信号
//zipWith:当一个界面多个请求的时候,要等所有请求完成才能更新ui
RACSignal *zipSignal = [signalA zipWith:signalB];
[zipSignal subscribeNext:^(id x) {
//zipWith:等所有信号都发送内容的时候才调用
NSLog(@"%@",x);
}];
[signalB sendNext:@"2"];
[signalA sendNext:@"1"];
//打印结果:
// (
//1,
//2
//)
}
combineLatest reduce先组合在聚合:
- (void)viewDidLoad {
//需求:登陆账号和密码都有值,登陆按钮可点
[super viewDidLoad];
//先组合 在聚合
//combineLatest:组合哪些信号 reduce:聚合
RACSignal *combineSignal = [RACSignal combineLatest:@[[_accountField rac_textSignal],[_passwordField rac_textSignal]] reduce:^id(NSString *account,NSString *password){//block的参数和组合的信号一一对应
//聚合的值就是组合信号的内容
//block调用时刻:只要源信号发送内容就回调用
return @(account.length && password.length);
}];
// [combineSignal subscribeNext:^(id x) {
// _loginButton.enabled = [x boolValue];
// }];
RAC(_loginButton,enabled) = combineSignal;
}
ReactiveCocoa操作方法之过滤
filter:过滤信号,使用它可以获取满足条件的信号.
- (void)viewDidLoad {
[super viewDidLoad];
//只有当文本框内容长度大于5,才获取文本框的内容
[[[_accountField rac_textSignal]filter:^BOOL(id value) {
//value:源信号的内容
//返回值:就是过滤条件,只有满足这个条件,才能获取到内容
return [value length] > 5;
}]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
ignore:忽略完某些值的信号.
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
RACSignal *ignoreSignal = [subject ignore:@"1"];
//ignoreValues:忽略所有值
// RACSignal *ignoreSignal = [subject ignoreValues];
[ignoreSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
//打印结果:2
}
take:从开始一共取N次的信号
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
[[subject take:1]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
//打印结果:1
}
takeLast:取最后N次的信号,前提条件,订阅者必须调用完成,因为只有完成,就知道总共有多少信号.
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
//takeLast:取后面多少个值,必须要发送完成
[[subject takeLast:2]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
[subject sendCompleted];
//打印结果:2 3
}
takeUntil:只要传入信号发送完成或者发送任意数据,就不会在接受源信号的内容
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
RACSubject *signal = [RACSubject subject];
[[subject takeUntil:signal]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[signal sendCompleted];
//[signal sendNext:@"a"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
//打印结果:1
}
distinctUntilChanged:当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉。
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
//打印结果:1 2
}
skip:(NSUInteger):跳过几个信号,不接受。
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
[[subject skip:2]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
//打印结果:3
}