ReactiveCocoa解析之RACReplaySubject
2016-12-24 本文已影响164人
kangyiii
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,所以发送信号可以写在订阅信号之前,订阅信号也可以写在发送信号之前。