2.RAC之RACSubject

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自己可以充当信号,也可以发送信号。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容