RACSubject
RACSubject繼承自RACSignal覆享,并實現(xiàn)RACSubscriber協(xié)議邓深。所以它可以生成信號源杜窄,也可以訂閱信號侄旬。
- (void)testSubject {
RACSubject *subject = [RACSubject subject];
// 作為信號源望抽,被訂閱
[subject subscribeNext:^(id x) {
NSLog(@"訂閱者一%@",x);
}];
[subject subscribeNext:^(id x) {
NSLog(@"訂閱者二%@",x);
}];
// 作為訂閱者至非,發(fā)送信號
[subject sendNext:@1];
}
RACSubject在被訂閱時,block會包裝進(jìn)RACSubscriber生成訂閱者o對象糠聪,然后通過subscribe:訂閱方法保存到subscribers數(shù)組中荒椭,所以RACSubject可以被訂閱多次。而RACSignal不具備此功能
RACReplaySubject
繼承自RACSubject舰蟆,會保存發(fā)送信號的值趣惠。所以在訂閱時,會把信號值全部發(fā)送身害。無論訂閱和發(fā)送信號的順序味悄,訂閱的block內(nèi)都會收到信號值。
- (void)testReplay {
RACReplaySubject *subject = [RACReplaySubject subject];
// 發(fā)送信號
[subject sendNext:@"12"];
// 訂閱信號
[subject subscribeNext:^(id x) {
NSLog(@"訂閱者一%@",x);
}];
// 發(fā)送信號
[subject sendNext:@"34"];
[subject sendNext:@"56"];
// 1.把值保存到數(shù)組
// 2.遍歷所有的訂閱者,調(diào)用nextBlock
// 訂閱信號
[subject subscribeNext:^(id x) {
NSLog(@"訂閱者二%@",x);
}];
}
RACReplaySubject把信號值存放在valuesReceived數(shù)組內(nèi)后塌鸯,會執(zhí)行父類的sendNext:方法侍瑟,所以即使是后面發(fā)送的信號,之前訂閱過也會收到。
RACBehaviorSubject
RACBehaviorSubject,把最后一次sendNext的值保存在currentValue變量內(nèi)曙旭。所以先訂閱的信號會收到每次發(fā)送的信號值,而后訂閱的信號之后收到最后一次信號值庭瑰。
RACGroupedSignal
可以講信號分組,一般用在[RACSignal groupBy:transform:]