ReactiveCocoa解析之RACReplaySubject

RACReplaySubject继承自RACSubject,所以RACReplaySubject既可以当做信号又可发送信号,但与RACSubject不同的是,RACSubject必须先订阅信号后发送信号,但RACReplaySubject既可以先订阅信号后发送信号,又可以先发送信号后订阅信号,即

  • 1.创建信号 **2.订阅信号 **3.发送信号
  • 1.创建信号 **2.发送信号 **3.订阅信号

RACReplaySubject

可以这写

    // 1.创建信号
    RACReplaySubject *subject = [RACReplaySubject subject];
    
    // 2.订阅信号
    [subject subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    
    // 3.发送信号
    [subject sendNext:@"我是发送的数据"];

又可以这么写

    // 1.创建信号
    RACReplaySubject *subject = [RACReplaySubject subject];
    
    // 2.发送信号
    [subject:@"我是发送的数据"];

    // 3.订阅信号
    [subject subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    

源码分析

1.创建信号:RACReplaySubject *subject = [RACReplaySubject subject];返回两个数组:_valuesReceived(存放sendNext:传入的block)和_subscribers(存放订阅信号时初始化出来的subscriber)。

2.发送信号:先将sendNext:传入的block存储起来,然后对_subscribers中的每个subscriber调用sendNext:

注意:如果这时还没有订阅者,_subscribers为0,将不会得到subscriber
3.订阅信号:首先会创建subscriber并将它加入_subscribers,随后会遍历_valuesReceived数组,用该subscriber将遍历出来的block作为参数执行sendNext:

总结

由于RACReplaySubject能够存储sendNext:的参数Block和subscriber,所以发送信号可以写在订阅信号之前,订阅信号也可以写在发送信号之前。

你可能感兴趣的:(ReactiveCocoa解析之RACReplaySubject)