RACReplaySubject繼承自RACSubject银室,所以RACReplaySubject既可以當(dāng)做信號又可發(fā)送信號备韧,但與RACSubject不同的是致板,RACSubject必須先訂閱信號后發(fā)送信號昆稿,但RACReplaySubject既可以先訂閱信號后發(fā)送信號辫封,又可以先發(fā)送信號后訂閱信號侠碧,即
- 1.創(chuàng)建信號 **2.訂閱信號 **3.發(fā)送信號
- 1.創(chuàng)建信號 **2.發(fā)送信號 **3.訂閱信號
RACReplaySubject
可以這寫
// 1.創(chuàng)建信號
RACReplaySubject *subject = [RACReplaySubject subject];
// 2.訂閱信號
[subject subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 3.發(fā)送信號
[subject sendNext:@"我是發(fā)送的數(shù)據(jù)"];
又可以這么寫
// 1.創(chuàng)建信號
RACReplaySubject *subject = [RACReplaySubject subject];
// 2.發(fā)送信號
[subject:@"我是發(fā)送的數(shù)據(jù)"];
// 3.訂閱信號
[subject subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
源碼分析
1.創(chuàng)建信號:RACReplaySubject *subject = [RACReplaySubject subject];
返回兩個數(shù)組:_valuesReceived
(存放sendNext:傳入的block
)和_subscribers
(存放訂閱信號時初始化出來的subscriber
)抹估。
2.發(fā)送信號:先將sendNext:傳入的block
存儲起來,然后對_subscribers
中的每個subscriber
調(diào)用sendNext:
弄兜。
注意:如果這時還沒有訂閱者药蜻,_subscribers
為0,將不會得到subscriber
替饿。
3.訂閱信號:首先會創(chuàng)建subscriber
并將它加入_subscribers
语泽,隨后會遍歷_valuesReceived
數(shù)組,用該subscriber
將遍歷出來的block作為參數(shù)執(zhí)行sendNext:
视卢。
總結(jié)
由于RACReplaySubject
能夠存儲sendNext:
的參數(shù)Block和subscriber
踱卵,所以發(fā)送信號可以寫在訂閱信號之前,訂閱信號也可以寫在發(fā)送信號之前据过。