RAC - 核心方法bind

文章系列
《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)