RACSubject可以作为信号(RACSign)使用同时又能发送信号,同时可以被多次订阅,非常适合触发一个点,多个点响应这样的需求。
RACSubject
和RACSignl一样,三个步骤1.创建信号 2.订阅信号 3.发送信号
//创建信号
RACSubject * subject = [RACSubject subject];
//订阅信号1
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"收到的内容1:%@",x);
}];
//订阅信号2
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"收到的内容2:%@",x);
}];
//发送信号
[subject sendNext:@"我是数据"];
//打印:
//收到的内容1:我是数据
//收到的内容2:我是数据
源码分析
细心的朋友可能已经发现与RACSinal不同的是RACSubject即作为信号,又作为订阅者发送信号。其实RACSubject是这样的:
这样也就不奇怪为什么RACSubject即可作为信号,又可作为订阅者发送信号了吧,其实一个类如果想拥有多个类的功能,可以继承一个类,再遵守多个类的协议,即面向协议思想。
1.
RACSubject * subject = [RACSubject subject];
创建信号并返回一个空数组。2.
[subject subscribeNext:^(id _Nullable x) {···}];
保存Block,并将订阅者加入到1中返回的数组中去。3.
[subject sendNext:@"我是数据"];
发送信号时遍历数组中的所有订阅者,并执行订阅者中的block.
运用场景
1.替代delegate
2.触发一点,多点响应的需求