Cold -> Hot?
一般的流程就是:
使用一个Subject来订阅原始信号(source signal, cold), 然后所有的订阅者都订阅这个Subject (hot).
实际中并不会直接去订阅RACSubject, 而是通过RACMulticastConnection的.signal或是.autoconnect获得一个冷信号. RACMulticastConnection则是使用了RACSubject或是其子类(RACReplaySubject)创建的.
提供了以下几种方法:
使用封装后的API(推荐):
/// implementation RACSignal (Operations)
1.
- (RACMulticastConnection *)publish;
将RACSignal转换成Subject(并没有connect!返回的RACMulticastConnection可以让你手动connect). 相当于:
RACSignal *coldSignal = [RACSignal createSignal:...];
RACSubject *subject = [RACSubject subject];
RACMulticastConnection *multicastConnection = [coldSignal multicast:subject];
2.
- (RACSignal *)replay;
- (RACSignal *)replayLast;
使用RACReplaySubject作为subject, 并且立即connect, 然后返回multicastConnection.signal.
replay即意味者后来的订阅者可以收到历史值.
replayLast即只能收到最近的一个历史值.
3.
- (RACSignal *)replayLazily;
和replay的区别就是, 只有在第一次订阅的时候, 才会去订阅sourceSignal!!!
使用基本API:
1.
RACSignal *coldSignal = [RACSignal createSignal:...];
RACSubject *subject = [RACSubject subject];
RACMulticastConnection *multicastConnection = [coldSignal multicast:subject];
RACSignal *hotSignal = multicastConnection.signal;
// 在2s之后才将hotSignal和subject连接起来, 在这之前(2s之前), 订阅subject的所有订阅者不会收到任何消息.
[[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{
[multicastConnection connect];
}];
2.
RACSignal *coldSignal = [RACSignal createSignal:...];
RACSubject *subject = [RACSubject subject];
RACMulticastConnection *multicastConnection = [coldSignal multicast:subject];
RACSignal *hotSignal = multicastConnection.autoconnect;
// autoconnect意味着, 一旦有人订阅, 就会立即connect.
Cold
- 只有有订阅者的时候才会发送消息.
- 新的订阅者会收到所有以前发送的消息.
- 一对一. 当有不同的订阅者, 历史消息全部重新完整发送. (取决于订阅时间)
Hot
- 哪怕没有订阅者, 也会时刻推送.
- 新的订阅者不会接收到以前发送的信息.
- 一对多. 如果同时有多个订阅者, 那么这几个订阅者会同时收到值. (取决于消息的发送时间)
- RACSubject: 标准的热信号.
- RACRelaySubject: 可以缓存历史记录的热信号. 订阅者在订阅时会收到所有的历史记录, 但是之后和标准的热信号一样.