一 一个请求发送完,返回数据后再发送另一个请求(得到的数据在同一方法中执行)
按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号
- (
void
)concat
{
// 组合
// concat: 皇上 , 皇太子
// 创建信号 A
RACSignal *siganlA = [RACSignal createSignal:^RACDisposable *( id <RACSubscriber> subscriber) {
// 发送请求
NSLog( @" 发送上部分请求 " );
// 发送信号
[subscriber sendNext: @" 上部分数据 " ];
[subscriber sendCompleted];
return nil ;
}];
RACSignal *siganlB = [RACSignal createSignal:^RACDisposable *( id <RACSubscriber> subscriber) {
// 发送请求
NSLog( @" 发送下部分请求 " );
// 发送信号
[subscriber sendNext: @" 下部分数据 " ];
return nil ;
}];
// concat: 按顺序去连接
// 注意 :concat, 第一个信号必须要调用 sendCompleted
// 创建组合信号
RACSignal *concatSignal = [siganlA concat:siganlB];
// 订阅组合信号
[concatSignal subscribeNext:^( id x) {
// 既能拿到 A 信号的值 , 又能拿到 B 信号的值
NSLog( @"%@" ,x);
}];
// 组合
// concat: 皇上 , 皇太子
// 创建信号 A
RACSignal *siganlA = [RACSignal createSignal:^RACDisposable *( id <RACSubscriber> subscriber) {
// 发送请求
NSLog( @" 发送上部分请求 " );
// 发送信号
[subscriber sendNext: @" 上部分数据 " ];
[subscriber sendCompleted];
return nil ;
}];
RACSignal *siganlB = [RACSignal createSignal:^RACDisposable *( id <RACSubscriber> subscriber) {
// 发送请求
NSLog( @" 发送下部分请求 " );
// 发送信号
[subscriber sendNext: @" 下部分数据 " ];
return nil ;
}];
// concat: 按顺序去连接
// 注意 :concat, 第一个信号必须要调用 sendCompleted
// 创建组合信号
RACSignal *concatSignal = [siganlA concat:siganlB];
// 订阅组合信号
[concatSignal subscribeNext:^( id x) {
// 既能拿到 A 信号的值 , 又能拿到 B 信号的值
NSLog( @"%@" ,x);
}];
}
二 用于连接两个信号,当第一个信号完成,才会连接then返回的信号(返回的信号是第二个信号的值)
- (
void
)then
{
// 创建信号 A
RACSignal *siganlA = [RACSignal createSignal:^RACDisposable *( id <RACSubscriber> subscriber) {
// 发送请求
NSLog( @" 发送上部分请求 " );
// 发送信号
[subscriber sendNext: @" 上部分数据 " ];
// 发送完成
[subscriber sendCompleted];
return nil ;
}];
// 创建信号 B
RACSignal *siganlB = [RACSignal createSignal:^RACDisposable *( id <RACSubscriber> subscriber) {
// 发送请求
NSLog( @" 发送下部分请求 " );
// 发送信号
[subscriber sendNext: @" 下部分数据 " ];
return nil ;
}];
// 创建组合信号
// then: 忽悠掉第一个信号所有值
RACSignal *thenSiganl = [siganlA then:^RACSignal *{
// 返回信号就是需要组合的信号
return siganlB;
}];
// 订阅信号
[thenSiganl subscribeNext:^( id x) {
NSLog( @"%@" ,x);
}];
{
// 创建信号 A
RACSignal *siganlA = [RACSignal createSignal:^RACDisposable *( id <RACSubscriber> subscriber) {
// 发送请求
NSLog( @" 发送上部分请求 " );
// 发送信号
[subscriber sendNext: @" 上部分数据 " ];
// 发送完成
[subscriber sendCompleted];
return nil ;
}];
// 创建信号 B
RACSignal *siganlB = [RACSignal createSignal:^RACDisposable *( id <RACSubscriber> subscriber) {
// 发送请求
NSLog( @" 发送下部分请求 " );
// 发送信号
[subscriber sendNext: @" 下部分数据 " ];
return nil ;
}];
// 创建组合信号
// then: 忽悠掉第一个信号所有值
RACSignal *thenSiganl = [siganlA then:^RACSignal *{
// 返回信号就是需要组合的信号
return siganlB;
}];
// 订阅信号
[thenSiganl subscribeNext:^( id x) {
NSLog( @"%@" ,x);
}];
}
三 把多个信号合并为一个信号,任何一个信号有新值的时候就会调用(没有顺序)
//
任意一个信号请求完成都会订阅到
- ( void )merge
{
// 创建信号 A
RACSubject *signalA = [RACSubject subject];
// 创建信号 B
RACSubject *signalB = [RACSubject subject];
// 组合信号
RACSignal *mergeSiganl = [signalA merge:signalB];
// 订阅信号
[mergeSiganl subscribeNext:^( id x) {
// 任意一个信号发送内容都会来这个 block
NSLog( @"%@" ,x);
}];
// 发送数据
[signalB sendNext: @" 下部分 " ];
[signalA sendNext: @" 上部分 " ];
- ( void )merge
{
// 创建信号 A
RACSubject *signalA = [RACSubject subject];
// 创建信号 B
RACSubject *signalB = [RACSubject subject];
// 组合信号
RACSignal *mergeSiganl = [signalA merge:signalB];
// 订阅信号
[mergeSiganl subscribeNext:^( id x) {
// 任意一个信号发送内容都会来这个 block
NSLog( @"%@" ,x);
}];
// 发送数据
[signalB sendNext: @" 下部分 " ];
[signalA sendNext: @" 上部分 " ];
}
四 把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元组,才会触发压缩流的next事件
- (
void
)zip
{
// zipWith: 夫妻关系
// 创建信号 A
RACSubject *signalA = [RACSubject subject];
// 创建信号 B
RACSubject *signalB = [RACSubject subject];
// 压缩成一个信号
// zipWith: 当一个界面多个请求的时候 , 要等所有请求完成才能更新 UI
// zipWith: 等所有信号都发送内容的时候才会调用
RACSignal *zipSignal = [signalA zipWith:signalB];
// 订阅信号
[zipSignal subscribeNext:^( id x) {
NSLog( @"%@" ,x);
}];
// 发送信号
[signalB sendNext:@2];
[signalA sendNext:@1];
{
// zipWith: 夫妻关系
// 创建信号 A
RACSubject *signalA = [RACSubject subject];
// 创建信号 B
RACSubject *signalB = [RACSubject subject];
// 压缩成一个信号
// zipWith: 当一个界面多个请求的时候 , 要等所有请求完成才能更新 UI
// zipWith: 等所有信号都发送内容的时候才会调用
RACSignal *zipSignal = [signalA zipWith:signalB];
// 订阅信号
[zipSignal subscribeNext:^( id x) {
NSLog( @"%@" ,x);
}];
// 发送信号
[signalB sendNext:@2];
[signalA sendNext:@1];
}
五 将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的signal至少都有过一次sendNext,才会触发合并的信号 (
用于信号发出的内容是元组,把信号发出元组的值聚合成一个值
)
//
组合
// 组合哪些信号
// reduce: 聚合
// reduceBlock 参数 : 根组合的信号有关 , 一一对应(2个textField)
RACSignal *comineSiganl = [RACSignal combineLatest:@[_accountFiled.rac_textSignal,_pwdField.rac_textSignal] reduce:^ id (NSString *account,NSString *pwd){
// block: 只要源信号发送内容就会调用 , 组合成新一个值
NSLog( @"%@ %@" ,account,pwd);
// 聚合的值就是组合信号的内容
return @(account.length && pwd.length);
}];
// 订阅组合信号
// [comineSiganl subscribeNext:^(id x) {
// _loginBtn.enabled = [x boolValue];
// }];
RAC(_loginBtn,enabled) = comineSiganl;
// 组合哪些信号
// reduce: 聚合
// reduceBlock 参数 : 根组合的信号有关 , 一一对应(2个textField)
RACSignal *comineSiganl = [RACSignal combineLatest:@[_accountFiled.rac_textSignal,_pwdField.rac_textSignal] reduce:^ id (NSString *account,NSString *pwd){
// block: 只要源信号发送内容就会调用 , 组合成新一个值
NSLog( @"%@ %@" ,account,pwd);
// 聚合的值就是组合信号的内容
return @(account.length && pwd.length);
}];
// 订阅组合信号
// [comineSiganl subscribeNext:^(id x) {
// _loginBtn.enabled = [x boolValue];
// }];
RAC(_loginBtn,enabled) = comineSiganl;