RAC组合
2018-01-04 本文已影响0人
幻梦_
concat 组合
- 按一定顺序执行
- 如我们处理网络请求时遇到先得到一个网络的返回再去请求另一个网络
- 相当于必须先执行完信号A才会执行信号B这时就会用到concat
//信号A
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"请求A数据");
[subscriber sendNext:@"AAA"];
[subscriber sendCompleted];//第一个信号必须调用sendCompleted
return nil;
}];
//信号B
RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"请求B数据");
[subscriber sendNext:@"BBB"];
return nil;
}];
//按顺序执行信号先执行A,再执行B
[[signalA concat:signalB] subscribeNext:^(id x) {
//既能拿到A信号的值,又能拿到B信号的值
NSLog(@"%@",x);
}];
then
- 注意: 使用then之前的信号的值会被忽略掉.
//忽略A 拿到B的数据
[[signalA then:^RACSignal * _Nonnull{
//返回信号就是需要组合的信号
return signalB;
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
merge
- 把多个信号合并为一个信号,任何一个信号有新值的时候就会调用,没有顺序
- 哪个先发送 就先执行哪个
RACSubject *subjectA = [RACSubject subject];
RACSubject *subjectB = [RACSubject subject];
RACSignal *mergeSignal = [subjectA merge:subjectB];
[mergeSignal subscribeNext:^(id x) {
//任意一个信号发送内容都回来到这个block
NSLog(@"%@",x);
}];
[subjectB sendNext:@"B"];
[subjectA sendNext:@"A"];
zipWith
- 把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元组
- 打印顺序跟组合顺序,跟发送的顺序无关
RACSubject *subjectA = [RACSubject subject];
RACSubject *subjectB = [RACSubject subject];
//压缩成一个信号
//zipWith:当一个界面有多个请求的时候,要等所有请求完成才能更新UI
RACSignal *zipSignal = [subjectA zipWith:subjectB];
[zipSignal subscribeNext:^(id x) {
//x 是元祖类型
NSLog(@"%@",x);
}];
[subjectA sendNext:@"1"];
[subjectB sendNext:@"2"];
combineLatest
- 当组合信号被订阅,内部会自动订阅signalA,signalB,必须两个信号都发出内容,才会被触发。
- 并且把两个信号组合成元组发出。
//创建信号A
RACSubject*signalA = [RACSubject subject];
//创建信号B
RACSubject*signalB = [RACSubject subject];
[[RACSignal combineLatest:@[signalA,signalB]]subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"%@",x);
}];
[signalA sendNext:@"A"];
[signalB sendNext:@"B"];
reduce聚合
- 把信号发出元组的值聚合成一个值,可以把数据处理完成返回一个新的值
//创建信号A
RACSubject*signalA = [RACSubject subject];
//创建信号B
RACSubject*signalB = [RACSubject subject];
[[RACSignal combineLatest:@[signalA,signalB] reduce:^id _Nullable(NSString *username,NSString *pwd){
//处理数据
return [NSString stringWithFormat:@"reduce--%@--%@",username,pwd];
}]subscribeNext:^(id _Nullable x) {
NSLog(@"reduce--%@",x);
}];
[signalA sendNext:@"A"];
[signalB sendNext:@"B"];