RAC框架源码解析之RACSubject

1、RACSubject

RACSubject 这个类是一个信号提供者!他可以充当信号,又能够发送信号,前面我们用RACSignal来创建信号,这次我们用RACSubject创建信号,如下:

    //1.创建信号
    RACSubject *subject = [RACSubject subject];
    
    //2.订阅信号
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"接收数据X: %@",x);
    }];
    
    //3.发送数据
    [subject sendNext:@"JM"];

RACSubject为什么具有创建信号的功能?

我们查看 RACSubject 的头文件发现它继承与 RACSignal,所有它具备了创建信号和发送信号的功能。

#import "RACSignal.h"
#import "RACSubscriber.h"

NS_ASSUME_NONNULL_BEGIN

/// A subject can be thought of as a signal that you can manually control by
/// sending next, completed, and error.
///
/// They're most helpful in bridging the non-RAC world to RAC, since they let you
/// manually control the sending of events.
@interface RACSubject : RACSignal 

/// Returns a new subject.
+ (instancetype)subject;

// Redeclaration of the RACSubscriber method. Made in order to specify a generic type.
- (void)sendNext:(nullable ValueType)value;

@end

NS_ASSUME_NONNULL_END

RACSubject *subject = [RACSubject subject]; 中的创建信号类方法 subject 到底做了什么事?

发现啥也没干,直接返回了自己,我们再往下看发现它重写了 init 方法,发现它创建了一个可变数据,

+ (instancetype)subject {
    return [[self alloc] init];
}

- (instancetype)init {
    self = [super init];
    if (self == nil) return nil;

    _disposable = [RACCompoundDisposable compoundDisposable];
    _subscribers = [[NSMutableArray alloc] initWithCapacity:1];
    
    return self;
}

[subject subscribeNext:^(id _Nullable x) {}]; 订阅信号做了什么事?

在讲RACSignal的时候我详细说明了这个方法的作用,我这里在简要说明一下,在 订阅信号 的时候它会创建一个 订阅者 在保存传进来的 block,只是这里唯一不同的是 self 变成了 subject,也就是说不同的信号订阅的方式不一样,因为类型不一定调用的方法也就不一样。

- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
    NSCParameterAssert(nextBlock != NULL);
    
    RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
    return [self subscribe:o];
}

[subject sendNext:@"JM"]; 发送数据有做了什么事?
点击进入查看 sendNext 的block方式,发现它只是在循环前端 订阅者 的数组并开始遍历,数组中存的就是订阅者对象,然后从新发送

- (void)sendNext:(id)value {
    [self enumerateSubscribersUsingBlock:^(id subscriber) {
        [subscriber sendNext:value];
    }];
}

demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo

联系我:
qq: 1245424073
微信: liujunmin6980

你可能感兴趣的:(RAC框架源码解析之RACSubject)