美文网首页
2.RAC之RACSubject

2.RAC之RACSubject

作者: Terrnce | 来源:发表于2017-05-27 18:46 被阅读24次

    RACSubject 很简单,如果你理解了RACSignal,那么RACSubject就不在话下了。

    我们先来看看RACSubject的头文件,很明了

    屏幕快照 2017-05-27 上午3.10.42.png

    一·创建RACSubject 信号

    RACSubject *subject = [RACSubject subject]; 
    

    二·订阅信号

    [subject subscribeNext:^(id x) {
            NSLog(@“订阅者订阅信号:%@",x);
        }];
    

    这里,我们看看RACSubject订阅信号底层发生了什么
    第一步跟RACSignal一样,就是创建订阅者RACSubscriber,保存nextBlock,我们主要来看一下它的第二步,看一下RACSubject subscribe:底层实现了什么。

    屏幕快照 2017-05-27 上午3.17.42.png

    上面我也说的很清楚,就是把创建的订阅者添加到订阅者数组里面去。

    三·发送信号

    [subject sendNext:@"hello RAC"];
    

    这里你发现了吗?
    此处我们是用RACSubject 来 sendNext,也就是我们用RACSubject来发送信号,但是,上一节RACSignal,我们是用RACSubscriber(订阅者)来发送信号。所以,RACSubject自己可以充当信号,也可以发送信号。
    接着,我们来看一下RACSubject sendNext底层实现


    屏幕快照 2017-05-27 上午3.33.39.png

    上面我们说过,RACSubject在subscribeNext(订阅信号)的时候是把订阅者存放到一个订阅者数组里面,sendNext(发送信号)就是 遍历订阅者数组,让订阅者数组里面的每一个订阅者 都去调用 sendNext 方法。

    完整例子

    //RACSubject创建信号
        RACSubject *subject = [RACSubject subject];
        
        //订阅信号,block调用时刻:当有RACSubject 执行 sendNext 方法的时候,就会调用
        [subject subscribeNext:^(id x) {
            NSLog(@"第一个订阅者订阅信号:%@",x);
        }];
        [subject subscribeNext:^(id x) {
             NSLog(@"第二个订阅者订阅信号:%@",x);
        }];
        
        [subject sendNext:@"hello world"];
        [subject sendNext:@“hello RAC"];
    

    输出结果

     2017-01-21 00:40:59.339 RACDemo[11729:1699454] 第一个订阅者订阅信号:hello world
     2017-01-21 00:40:59.339 RACDemo[11729:1699454] 第二个订阅者订阅信号:hello world
     2017-01-21 00:40:59.340 RACDemo[11729:1699454] 第一个订阅者订阅信号: hello RAC
     2017-01-21 00:40:59.340 RACDemo[11729:1699454] 第二个订阅者订阅信号: hello RAC
    

    总结RACSubject

    1.创建RACSubject信号
    2.订阅信号(subscribeNext)。本质就是创建订阅者,把订阅者放到数组里面。
    3.发送信号(sendNext)。本质就是让订阅者数组里面的每一个订阅者都去调用 sendNext 方法。
    RACSubject自己可以充当信号,也可以发送信号。

    相关文章

      网友评论

          本文标题:2.RAC之RACSubject

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