一些知识点
- RACSubject继承与RACSignal,并且遵循RACSubscriber协议,因此既能当信号,也能发送信号
- 通常用来代替代理
RACSubject的派生类
- RACGroupedSignal :分组信号,用来实现 RACSignal 的分组功能。
- RACBehaviorSubject :重演最后值的信号,当被订阅时,会向订阅者发送它最后接收到的值。
- RACReplaySubject :重演信号,保存发送过的值,当被订阅时,会向订阅者重新发送这些值。
RACReplaySubject和RACSubject的区别
RACSubject必须先订阅信号,才能接收到信号
1.调用sendNext时,不会保存值,会遍历保存的所有订阅者并执行其nextBlock。
2.调用subscribeNext时,只是把订阅者和其nextBlock保存起来,但不执行。RACReplaySubject可以先发送信号,再订阅信号
1.调用sendNext时,会把值保存起来,然后遍历保存的所有订阅者并执行其nextBlock。
2.调用subscribeNext时,遍历保存的所有值,分别调用本次subscribeNext的订阅者的nextBlock。(就是说当前有多少个值,就调用多少次本次订阅者的nextBlock)
// 1.创建信号
RACSubject *subject = [RACSubject subject];
//在订阅前发送的话,这个消息是不会被接收到的
[subject sendNext:@"0"];
// 2.订阅信号
[subject subscribeNext:^(id x) {
NSLog(@"第一个订阅者%@",x);
}];
[subject subscribeNext:^(id x) {
NSLog(@"第二个订阅者%@",x);
}];
// 3.发送信号
[subject sendNext:@"1"];
//输出
//第一个订阅者 1
//第二个订阅者 1
//第一个订阅者 2
//第二个订阅者 2
// 1.创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject];
// 2.发送信号
[replaySubject sendNext:@1];
[replaySubject sendNext:@2];
// 3.订阅信号
[replaySubject subscribeNext:^(id x) {
NSLog(@"第一个订阅者接收到的数据 %@",x);
}];
// 订阅信号
[replaySubject subscribeNext:^(id x) {
NSLog(@"第二个订阅者接收到的数据 %@",x);
}];
//注意如果之后再发送信号,就会按订阅者的顺序发送消息
[replaySubject sendNext:@3];
//输出
//第一个订阅者接收到的数据 1
//第一个订阅者接收到的数据 2
//第二个订阅者接收到的数据 1
//第二个订阅者接收到的数据 2
//第一个订阅者接收到的数据 3 <-- 注意这里后面的顺序变回了“一、二”
//第二个订阅者接收到的数据 3