场景:
当同一个信号被多次订阅多次的时候,需要只发送一次请求多个地方在用,而不是没订阅一次发送一次请求,造成发送了多次请求
//1.创建信号
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送网络请求
NSLog(@"发送请求");
//发送数据
[subscriber sendNext:@"请求到的数据"];
return nil;
}];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"A处在处理数据%@",x);
}];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"b处在处理数据%@",x);
}];
Snip20181105_4.png
上图就出现了同一个信号多次订阅发送多次请求的问题
解决:RACMulticastConnection
//不管订阅多少次信号,就只会请求一次数据
//RACMulticastConnection:必须要有信号
//1.创建信号
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送网络请求
NSLog(@"发送请求");
//发送数据
[subscriber sendNext:@"请求到的数据"];
return nil;
}];
//2.将信号转成连接类!!
RACMulticastConnection *connection = [signal publish];
//3.订阅连接类的信号
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"A处在处理数据%@",x);
}];
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"B处在处理数据%@",x);
}];
//4.连接
[connection connect];
Snip20181105_5.png
内部实现
第一步:创建信号RACDynamicSignal 保存didSubscribe这个block详情可看 RACSubject类发送信号过程的低层实现
第二步:将信号转成连接类
RACMulticastConnection *connection = [signal publish];
其实就是保存了一个信号及RACSubject对象
Snip20181105_9.png
Snip20181105_10.png
第三步:订阅连接类的信号
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"A处在处理数据%@",x);
}];
上面的connection.signal就是第二步中保存的RACSubject属性
这一步内部实现参照RACSubject实现过程
第四步:连接
[connection connect];
Snip20181105_11.png
这个方法作用是调用第一步中的保存的block
Snip20181105_13.png
接下来就是执行RACSubject发送信号的方法:内部调用见RACSubject类发送信号过程的低层实现
里面是通过遍历保存订阅者的数组subscribers 订阅者执行nextblock实现发送信号操作
流程图
Snip20181105_14.png










网友评论