ReactiveCocoa解析之RACSubject

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是这样的:

ReactiveCocoa解析之RACSubject_第1张图片
Snip20161222_1.png

这样也就不奇怪为什么RACSubject即可作为信号,又可作为订阅者发送信号了吧,其实一个类如果想拥有多个类的功能,可以继承一个类,再遵守多个类的协议,即面向协议思想。
1. RACSubject * subject = [RACSubject subject];创建信号并返回一个空数组。
2. [subject subscribeNext:^(id _Nullable x) {···}];保存Block,并将订阅者加入到1中返回的数组中去。
3. [subject sendNext:@"我是数据"];发送信号时遍历数组中的所有订阅者,并执行订阅者中的block.

运用场景

1.替代delegate
2.触发一点,多点响应的需求

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