reactiveCocoa实践三(信号组合)

一     一个请求发送完,返回数据后再发送另一个请求(得到的数据在同一方法中执行) 按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号
- ( 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);
       
    }];

}


二 用于连接两个信号,当第一个信号完成,才会连接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);
    }];

}




三 把多个信号合并为一个信号,任何一个信号有新值的时候就会调用(没有顺序)
// 任意一个信号请求完成都会订阅到
- (
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];

}




五 将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的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;
    

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值