美文网首页
RAC - 核心方法bind

RAC - 核心方法bind

作者: 下班不写程序 | 来源:发表于2020-10-15 15:27 被阅读0次

    文章系列
    《ReactiveCocoa 概述》
    《RACSignal》
    《RACDisposable》
    《RACSubject、RACReplaySubject(内附冷信号和热信号的区别)》
    《集合RACTuple、RACSequence》
    《RAC 中的通知、代理、KVO, 基本事件、方法的监听》
    《rac_liftSelector》
    《RACMulticastConnection》
    《RACCommand》
    《RAC - 核心方法bind》
    《RAC - 定时器》
    《RACScheduler》
    《RAC - 点击获取验证码 demo》
    《RAC - 映射(Map & flattenMap)》
    《RAC信号操作解释合集》
    《RAC - 信号的生命周期》

    • bind: 给RAC的信号进行绑定,只要信号已发送数据,就能监听到,从而把数据改成自己想要的

    • 方法分析

    bind方法参数: 需要传入一个返回值是RACSignalBindBlock 的block.

    - (RACSignal *)bind:(RACSignalBindBlock (^)(void))block 
    

    RACSignalBindBlock是一个block的类型,返回值是信号,参数(value,stop),因此参数的block返回值也是一个block.

    typedef RACSignal * _Nullable (^RACSignalBindBlock)(ValueType _Nullable value, BOOL *stop);
    
    1. 参数一(value): 表示接收到信号的原始值,还没做处理
    2. 参数二(*stop): 用来控制绑定Block,如果*stop = yes,那么就会结束绑定
    3. 返回值:信号,做好处理,在通过这个信号返回出去,一般使用RACReturnSignal,需要手动导入头文件#import "RACReturnSignal.h"
    • 原理分析

    可以先参考 RACSignal 熟悉下信号的订阅.

    1. 源信号调用bind, 会重新创建一个绑定信号.
    2. 当绑定信号被订阅, 就会调用绑定信号中的didSubscribe 生成一个bindingBlock.
    3. 当源信号有内容发出, 就会把内容传递到bindingBlock处理, 调用bindingBlock(value,stop).
    4. 调用bindingBlock(value,stop) 会返回一个内容处理完成的信号RACReturnSignal.
    5. 订阅RACReturnSignal 就会拿到绑定信号的订阅者, 把处理完成的信号内容发送出来.
    • 代码练习
      假设在源信号发送的数据之前拼接"do bind" 字符串
    - (void)RAC_bindTest {
        
        // 创建信号
        RACSubject *subject = [RACSubject subject];
        
        // 绑定信号
        RACSignal *bindSignal = [subject bind:^RACSignalBindBlock _Nullable {
            
            // return 的这个大的block 的作用:表示绑定了一个源信号 - subject
            return ^RACSignal *(id _Nullable value, BOOL *stop) {
                
                // 什么时候调用block: 当源信号有新的值发出, 就会来到这个block
                NSLog(@"subject 发送了新信号: %@", value);
                
                // block作用:做返回值的处理
                NSString *newString = [NSString stringWithFormat:@"do bind: %@", value];
                
                // 做好处理,通过信号返回出去.
                return [RACReturnSignal return:newString];
            };
        }];
        
        // 订阅绑定信号 -> 获得处理之后的信号
        [bindSignal subscribeNext:^(id  _Nullable x) {
                
            NSLog(@"%@", x);
        }];
        
        // 源信号发送数据
        [subject sendNext:@"156xxxxxxxx"];
    }
    
    打印结果: bind 操作新数据之后的打印结果

    .End

    相关文章

      网友评论

          本文标题:RAC - 核心方法bind

          本文链接:https://www.haomeiwen.com/subject/iapipktx.html