我們直接看RACReplaySubject頭文件,可以看到RACReplaySubject是繼承自RACSubject。
RACReplaySubject創(chuàng)建信號(hào)的兩種方式
/// 第一種方式
RACReplaySubject *subject = [RACReplaySubject subject];
/// 第二種方式,通過(guò)設(shè)置capacity來(lái)限定它接收事件的數(shù)量,這個(gè)方法下面會(huì)說(shuō)到
RACReplaySubject *replaySubject = [RACReplaySubject replaySubjectWithCapacity:2];
查看RACReplaySubject底層是如何實(shí)現(xiàn)訂閱信號(hào)的
- 第①步:還是創(chuàng)建一個(gè)訂閱者RACSubscriber,保存nextBlock
- 第②步:看下圖
這里可以看到,雖然RACReplaySubject 是繼承于RACSubject的,但是他們的實(shí)現(xiàn)訂閱的方式卻是不一樣的。
RACSubject通過(guò)將創(chuàng)建的訂閱者RACSubscriber保存到一個(gè)訂閱者數(shù)組subscribers中去,然后發(fā)送信號(hào)sendNext的時(shí)候通過(guò)遍歷訂閱者subscribers取得每一個(gè)訂閱者RACSubscriber,然后讓訂閱者去執(zhí)行nextBlock。
RACReplaySubject 通過(guò)遍歷 一個(gè)self.valuesReceived數(shù)組,讓新創(chuàng)建的訂閱者RACSubscriber 去執(zhí)行 sendNext操作。這里也就是說(shuō)RACReplaySubject 在執(zhí)行訂閱操作的時(shí)候就已經(jīng)能夠發(fā)送信號(hào)了,這個(gè)跟前面學(xué)的RACSignal和RACSubject不一樣。
那么,這個(gè)self.valuesReceived又是什么呢?
這個(gè)要從RACReplaySubject頭文件里面一個(gè)類(lèi)方法開(kāi)始看起
/// Creates a new replay subject with the given capacity. A capacity of
/// RACReplaySubjectUnlimitedCapacity means values are never trimmed.
/// 通過(guò)設(shè)置capacity來(lái)限定它接收重接收事件的數(shù)量
+ (instancetype)replaySubjectWithCapacity:(NSUInteger)capacity;
看一下他的實(shí)現(xiàn)
很簡(jiǎn)單,其實(shí)就是通過(guò)傳入的capacity去創(chuàng)建一個(gè)指定長(zhǎng)度的數(shù)組。
查看RACReplaySubject底層是如何實(shí)現(xiàn)發(fā)送信號(hào)的
使用例子
/// 設(shè)置接受事件的數(shù)量為2
RACReplaySubject *replaySubject = [RACReplaySubject replaySubjectWithCapacity:2];
[replaySubject sendNext:@"hello world”]; //這句打印會(huì)被移除,原因是因?yàn)榍懊嬖O(shè)置了接收事件的數(shù)量為2
[replaySubject sendNext:@"rac"];
[replaySubject sendNext:@"text 3"];
[replaySubject subscribeNext:^(id x) {
NSLog(@"第一個(gè)訂閱者接收到的數(shù)據(jù)%@",x);
}];
[replaySubject subscribeNext:^(id x) {
NSLog(@"第二個(gè)訂閱者接收到的數(shù)據(jù)%@",x);
}];
打印結(jié)果:
2017-05-30 20:38:25.890 RACDemo[3182:1376598] 第一個(gè)訂閱者接收到的數(shù)據(jù)rac
2017-05-30 20:38:25.891 RACDemo[3182:1376598] 第一個(gè)訂閱者接收到的數(shù)據(jù)text 3
2017-05-30 20:38:25.891 RACDemo[3182:1376598] 第二個(gè)訂閱者接收到的數(shù)據(jù)rac
2017-05-30 20:38:25.891 RACDemo[3182:1376598] 第二個(gè)訂閱者接收到的數(shù)據(jù)text 3
假如你這里把 subscribeNext 操作放到 sendNext 操作前面,那么效果就跟RACSubject一樣,你設(shè)置的replaySubjectWithCapacity:2 不起任何作用。
總結(jié):
- RACReplaySubject 是 RACSubject的子類(lèi)
- RACReplaySubject 可以先sendNext ,再執(zhí)行 subscribeNext。
- RACReplaySubject 可以通過(guò) replaySubjectWithCapacity:初始化方法設(shè)置接受事件數(shù)量。