前言
在這里說(shuō)說(shuō)當(dāng)有多個(gè)訂閱者,但是我們只想發(fā)送一個(gè)信號(hào)的時(shí)候怎么辦?
我們就可以用RACMulticastConnection,來(lái)實(shí)現(xiàn)

welcome.jpg
先來(lái)上demo鏈接https://github.com/muyang00/YERACDemo.git
RACMulticastConnection使用步驟
- 1、創(chuàng)建信號(hào) +(RACSignal)createSignal
- 2、創(chuàng)建連接 RACMulticastConnection *connect = [signal publish];
- 3、訂閱信號(hào),注意:訂閱的不再是之前的信號(hào),而是連接的信號(hào) [connect.signal subscribeNext];
- 4、連接 [connect connect];
淺談RACMulticastConnection底層原理
- 1、 創(chuàng)建connect,connect.sourceSignal -> RACSignal(原始信號(hào)) connect.signal -> RACSubject
- 2、 訂閱connect.signal,會(huì)調(diào)用RACSubject的subscribeNext,創(chuàng)建訂閱者,而且把訂閱者保存起來(lái),不會(huì)執(zhí)行block。
- 3、 [connect connect]內(nèi)部會(huì)訂閱RACSignal(原始信號(hào)),并且訂閱者是RACSubject
3.1、 訂閱原始信號(hào),就會(huì)調(diào)用原始信號(hào)中的didSubscribe
3.2、 didSubscribe,拿到訂閱者調(diào)用sendNext,其實(shí)是調(diào)用RACSubject的sendNext - 4、 RACSubject的sendNext,會(huì)遍歷RACSubject所有訂閱者發(fā)送信號(hào)。
4.1、 因?yàn)閯倓偟诙剑际窃谟嗛哛ACSubject,因此會(huì)拿到第二步所有的訂閱者,調(diào)用他們的nextBlock
直接上干貨了
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// didSubscribeblock中的代碼都統(tǒng)稱(chēng)為副作用。
// 發(fā)送請(qǐng)求---比如afn
NSLog(@"發(fā)送請(qǐng)求啦");
// 發(fā)送信號(hào)
[subscriber sendNext:@"信號(hào)"];
return nil;
}];
[signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
打印結(jié)果為:

image1.png
但是這樣有個(gè)問(wèn)題沒(méi)訂閱一次信號(hào)就得重新創(chuàng)建并發(fā)送請(qǐng)求,這樣很不友好
so
使用RACMulticastConnection,無(wú)論有多少個(gè)訂閱者,無(wú)論訂閱多少次,我只發(fā)送一個(gè)。
// 1.發(fā)送請(qǐng)求,用一個(gè)信號(hào)內(nèi)包裝,不管有多少個(gè)訂閱者,只想發(fā)一次請(qǐng)求
RACSignal *resignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請(qǐng)求
NSLog(@"注意啦,我只發(fā)一次請(qǐng)求");
// 發(fā)送信號(hào)
[subscriber sendNext:@"信號(hào)"];
return nil;
}];
//2. 創(chuàng)建連接類(lèi)
RACMulticastConnection *connection = [resignal publish];
[connection.signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
//3. 連接。只有連接了才會(huì)把信號(hào)源變?yōu)闊嵝盘?hào)
[connection connect];
打印結(jié)果為:

image2.png
最后
不積跬步,無(wú)以至千里;不積小流,無(wú)以成江海