- RACSubject
继承自 RACSignal,所以signal能用的他都能用啦
另外 RACSubject是信号提供者,自己可以充当信号,又能发送信号。一篇文章中说它是用于桥接非 RAC 代码到 ReactiveCocoa 世界的『可变』信号(好腻害的样纸用法却很简单)
创建方法:
(1)创建RACSubject
(2)订阅信号
(3)发送信号
工作流程:
(1)订阅信号时,内部保存了订阅者,和订阅者响应block
(2)当发送信号的,遍历订阅者,调用订阅者的nextBlock
注:如果订阅信号,必须在发送信号之前订阅信号,不然收不到信号
//RACSignal 创建信号
//RACSubcriber 发送信号
//RACSubject 既可以创建信号 也可以发送信号
//1创建信号
RACSubject *subject = [RACSubject subject];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"111接收到信号 %@",x);
}];
//3.发送数据
[subject sendNext:@1];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"222接收到信号 %@",x);
}];
//3.发送数据
[subject sendNext:@2];
- RACBehaviorSubject
它在内部会保存一个 currentValue 对象,也就是最后一次发送的消息,在每次执行 -sendNext: 时,都会对 RACBehaviorSubject 中保存的 currentValue 进行更新,并使用父类的 -sendNext: 方法,向所有的订阅者发送最新的消息
RACBehaviorSubject *subject = [RACBehaviorSubject subject];
[subject sendNext:@100];
[subject sendNext:@101];
[subject sendNext:@102];
[subject sendNext:@103];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"111接收到信号 %@",x);
}];
//3.发送数据
[subject sendNext:@1];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"222接收到信号 %@",x);
}];
//3.发送数据
[subject sendNext:@2];
[subject sendNext:@210];
[subject sendNext:@211];
[subject sendCompleted];
- RACReplaySubject
(1)创建RACSubject
(2)订阅信号
(3)发送信号
工作流程:
(1)订阅信号时,内部保存了订阅者,和订阅者响应block
(2)当发送信号的,遍历订阅者,调用订阅者的nextBlock
(3)发送的信号会保存起来,当订阅者订阅信号的时,会将之前保存的信号,一个一个作用于新的订阅者,保存信号的容量由capacity决定,这也是有别有RACSubject的,发送所有的消息
RACReplaySubject *subject = [RACReplaySubject subject];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"111接收到信号 %@",x);
}];
//3.发送数据
[subject sendNext:@1];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"222接收到信号 %@",x);
}];
//3.发送数据
[subject sendNext:@2];
摘录参考文章
『可变』的热信号 RACSubject