RACSubject
RACSubject继承自RACSignal,并实现RACSubscriber协议。所以它可以生成信号源,也可以订阅信号。
- (void)testSubject {
RACSubject *subject = [RACSubject subject];
// 作为信号源,被订阅
[subject subscribeNext:^(id x) {
NSLog(@"订阅者一%@",x);
}];
[subject subscribeNext:^(id x) {
NSLog(@"订阅者二%@",x);
}];
// 作为订阅者,发送信号
[subject sendNext:@1];
}
RACSubject在被订阅时,block会包装进RACSubscriber生成订阅者o对象,然后通过subscribe:订阅方法保存到subscribers数组中,所以RACSubject可以被订阅多次。而RACSignal不具备此功能
RACReplaySubject
继承自RACSubject,会保存发送信号的值。所以在订阅时,会把信号值全部发送。无论订阅和发送信号的顺序,订阅的block内都会收到信号值。
- (void)testReplay {
RACReplaySubject *subject = [RACReplaySubject subject];
// 发送信号
[subject sendNext:@"12"];
// 订阅信号
[subject subscribeNext:^(id x) {
NSLog(@"订阅者一%@",x);
}];
// 发送信号
[subject sendNext:@"34"];
[subject sendNext:@"56"];
// 1.把值保存到数组
// 2.遍历所有的订阅者,调用nextBlock
// 订阅信号
[subject subscribeNext:^(id x) {
NSLog(@"订阅者二%@",x);
}];
}
RACReplaySubject把信号值存放在valuesReceived数组内后,会执行父类的sendNext:方法,所以即使是后面发送的信号,之前订阅过也会收到。
RACBehaviorSubject
RACBehaviorSubject,把最后一次sendNext的值保存在currentValue变量内。所以先订阅的信号会收到每次发送的信号值,而后订阅的信号之后收到最后一次信号值。
RACGroupedSignal
可以讲信号分组,一般用在[RACSignal groupBy:transform:]
网友评论