RAC-bind的实现浅析

简单的先附上一段代码,这里就是给subject取绑定一个信号,然后subject去发送数据之后可以在^RACSignal * (id value, BOOL *stop)这个block进行处理,然后之后返回的话就返回[RACReturnSignal return:value]; 以处理完数据包装成一个信号,然后下面的bindSignal收到的就是我们处理过的数据了

    //1.创建信号
    RACSubject * subject = [RACSubject subject];
    //2.绑定信号
    RACSignal * bindSignal = [subject bind:^RACSignalBindBlock _Nonnull{
        
        return ^RACSignal * (id value, BOOL *stop){
            NSLog(@"%@",value);
            return [RACReturnSignal return:value];
       
        };
    }];

    //3.订阅信号
    [bindSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"绑定接收到!! %@",x);
    }];

    //4.发送
    [subject sendNext:@"发送原始的数据"];
首先我们可以先去看bind这个方法,我们会发现里面就是去创建了一个信号,然后调用在外面保存的 ^RACSignalBindBlock _Nonnull这个block里面的内容,知道就是返回一个下面这种类型的block

typedef RACSignal * _Nullable (^RACSignalBindBlock)(ValueType _Nullable value, BOOL *stop);


我们再往下看,我们会发现下面对外面我们创建的subject也就是源信号对象进行了订阅,以及在订阅的block里面还去调用了我们上面保存的bindingBlock,什么时候会调用我们订阅的block就是在我们外面用subject sendNext的时候,所以是下面调用的bindingBlock传入的x,自然也就是我们subject sendNext传入的数据了。这里通过调用bindingBlock还产生了一个信号,这个信号也就是RACReturnSignal类型的。

接下看看上面的addSignal的调用,我们把代码再往上移其实会发现上面的对addSignal这个block的赋值是这样的,最重要的一点其实就是对这个signal信号进行了订阅


然后我们再进行查看RACReturnSignal订阅的代码,我们会发现先去进入了它的父类RACSignal的方法。

对于上面的方法我们需要注意的就是subscribe的方法,最后调用的是下面的这个RACReturnSignal的subscribe方法

然后我们再点进去schedule这个方法注意点的是点的是下面的这个,然后我们再点点点,会发现我们关注的其实就是schedule:后面的那个block什么时候调用,点下去会发现是会被即刻调用的,也就是说这里让subscriber去发送消息了,而这个subscriber是我们在上面调用父类的方法中创建的。

然后我们回到这段代码,这里会被调用因为上面的signal信号订阅的方法中用到的subscriber其实就是创建bindSignal中产生的subscriber方法,所以下面会收到消息

 [bindSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"绑定接收到!! %@",x);
    }];

这里订阅信号其实就是去执行了先前create信号时保存的那个block,然后把订阅者传入了里面

之后执行block里面的内容执行到这里








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值