简单的先附上一段代码,这里就是给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里面的内容执行到这里