RACSubject
RACSubject繼承自RACSignal,并實(shí)現(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:]