RACSubject 很简单,如果你理解了RACSignal,那么RACSubject就不在话下了。
我们先来看看RACSubject的头文件,很明了
一·创建RACSubject 信号
RACSubject *subject = [RACSubject subject];
二·订阅信号
[subject subscribeNext:^(id x) {
NSLog(@“订阅者订阅信号:%@",x);
}];
这里,我们看看RACSubject订阅信号底层发生了什么
第一步跟RACSignal一样,就是创建订阅者RACSubscriber,保存nextBlock,我们主要来看一下它的第二步,看一下RACSubject subscribe:底层实现了什么。
上面我也说的很清楚,就是把创建的订阅者添加到订阅者数组里面去。
三·发送信号
[subject sendNext:@"hello RAC"];
这里你发现了吗?
此处我们是用RACSubject 来 sendNext,也就是我们用RACSubject来发送信号,但是,上一节RACSignal,我们是用RACSubscriber(订阅者)来发送信号。所以,RACSubject自己可以充当信号,也可以发送信号。
接着,我们来看一下RACSubject sendNext底层实现
上面我们说过,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自己可以充当信号,也可以发送信号。