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
,所以发送信号可以写在订阅信号之前,订阅信号也可以写在发送信号之前。