美文网首页
[iOS][RAC]--RACMulticastConnecti

[iOS][RAC]--RACMulticastConnecti

作者: 阿不不不不 | 来源:发表于2018-11-05 10:13 被阅读5次

场景:

当同一个信号被多次订阅多次的时候,需要只发送一次请求多个地方在用,而不是没订阅一次发送一次请求,造成发送了多次请求

//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

相关文章

网友评论

      本文标题:[iOS][RAC]--RACMulticastConnecti

      本文链接:https://www.haomeiwen.com/subject/ibbjxqtx.html