文章系列
《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);
- 参数一(value): 表示接收到信号的原始值,还没做处理
- 参数二(*stop): 用来控制绑定Block,如果
*stop = yes
,那么就会结束绑定- 返回值:信号,做好处理,在通过这个信号返回出去,一般使用
RACReturnSignal
,需要手动导入头文件#import "RACReturnSignal.h"
- 原理分析
可以先参考 RACSignal 熟悉下信号的订阅.
- 源信号调用
bind
, 会重新创建一个绑定信号.- 当绑定信号被订阅, 就会调用绑定信号中的
didSubscribe
生成一个bindingBlock
.- 当源信号有内容发出, 就会把内容传递到
bindingBlock
处理, 调用bindingBlock(value,stop)
.- 调用
bindingBlock(value,stop)
会返回一个内容处理完成的信号RACReturnSignal
.- 订阅
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"];
}
打印结果:
.End