RACSubject及其子类的一些用法

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:]

你可能感兴趣的:(RACSubject及其子类的一些用法)