RACSubject 很簡單,如果你理解了RACSignal,那么RACSubject就不在話下了。
我們先來看看RACSubject的頭文件搔体,很明了
一·創(chuàng)建RACSubject 信號
RACSubject *subject = [RACSubject subject];
二·訂閱信號
[subject subscribeNext:^(id x) {
NSLog(@“訂閱者訂閱信號:%@",x);
}];
這里,我們看看RACSubject訂閱信號底層發(fā)生了什么
第一步跟RACSignal一樣,就是創(chuàng)建訂閱者RACSubscriber,保存nextBlock,我們主要來看一下它的第二步,看一下RACSubject subscribe:底層實(shí)現(xiàn)了什么。
上面我也說的很清楚荸哟,就是把創(chuàng)建的訂閱者添加到訂閱者數(shù)組里面去。
三·發(fā)送信號
[subject sendNext:@"hello RAC"];
這里你發(fā)現(xiàn)了嗎瞬捕?
此處我們是用RACSubject 來 sendNext鞍历,也就是我們用RACSubject來發(fā)送信號,但是山析,上一節(jié)RACSignal堰燎,我們是用RACSubscriber(訂閱者)來發(fā)送信號。所以笋轨,RACSubject自己可以充當(dāng)信號秆剪,也可以發(fā)送信號赊淑。
接著,我們來看一下RACSubject sendNext底層實(shí)現(xiàn)
上面我們說過仅讽,RACSubject在subscribeNext(訂閱信號)的時候是把訂閱者存放到一個訂閱者數(shù)組里面陶缺,sendNext(發(fā)送信號)就是 遍歷訂閱者數(shù)組,讓訂閱者數(shù)組里面的每一個訂閱者 都去調(diào)用 sendNext 方法洁灵。
完整例子
//RACSubject創(chuàng)建信號
RACSubject *subject = [RACSubject subject];
//訂閱信號饱岸,block調(diào)用時刻:當(dāng)有RACSubject 執(zhí)行 sendNext 方法的時候,就會調(diào)用
[subject subscribeNext:^(id x) {
NSLog(@"第一個訂閱者訂閱信號:%@",x);
}];
[subject subscribeNext:^(id x) {
NSLog(@"第二個訂閱者訂閱信號:%@",x);
}];
[subject sendNext:@"hello world"];
[subject sendNext:@“hello RAC"];
輸出結(jié)果
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
總結(jié)RACSubject
1.創(chuàng)建RACSubject信號
2.訂閱信號(subscribeNext)徽千。本質(zhì)就是創(chuàng)建訂閱者苫费,把訂閱者放到數(shù)組里面。
3.發(fā)送信號(sendNext)双抽。本質(zhì)就是讓訂閱者數(shù)組里面的每一個訂閱者都去調(diào)用 sendNext 方法百框。
RACSubject自己可以充當(dāng)信號,也可以發(fā)送信號牍汹。