RACPassthroughSubscriber

上一节中讲了RACSubscriber,其中说到了RACPassthroughSubscriber遵守了RACSubscriber协议,所以接下来分析RACPassthroughSubscriber

RACPassthroughSubscriber.h中发现只有一个方法:

- (instancetype)initWithSubscriber:(id<RACSubscriber>)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable;

翻译一下这个方法的注释如下:
* 该类是一个私有类,作用是在订阅者没有销毁的情况下,使用订阅者发送所有的事件。
* subscriber,订阅者,用于发送所有的事件,不能为nil
* signal,信号,订阅者所订阅的信号。
* disposable,清理对象,当这个清理对象做了清理工作,不会再发送任何事件。这个参数也不能为nil

接下去看看.m中的方法:

- (instancetype)initWithSubscriber:(id<RACSubscriber>)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable {
    NSCParameterAssert(subscriber != nil);

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

    _innerSubscriber = subscriber;
    _signal = signal;
    _disposable = disposable;

    [self.innerSubscriber didSubscribeWithDisposable:self.disposable];
    return self;
}

初始化方法,通过参数完成初始化工作,并将每个参数都保存到实例变量中。注意最后的代码[self.innerSubscriber didSubscribeWithDisposable:self.disposable];就是将self.disposable保存到self.innerSubscriber当中,因为self.innerSubscriber可以订阅多个信号,所以应当会有多个disposable对象。


- (void)sendNext:(id)value {
    if (self.disposable.disposed) return;

    if (RACSIGNAL_NEXT_ENABLED()) {
        RACSIGNAL_NEXT(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description), cleanedDTraceString([value description]));
    }

    [self.innerSubscriber sendNext:value];
}

首先,该方法中有关于dtrace的内容,由于目前我对其不太了解,其中涉及到这块的东西都会略过,不影响主要的逻辑部分。接着看看主要作用,在保证当前的清理对象没有清理之前通过self.innerSubscriber订阅者调用sendNext:事件。注意,这里清理对象的清理工作应该是在订阅者中处理的,因为该类是个私有类,并且_disposable是个私有变量,外部不应该直接调用的。


- (void)sendError:(NSError *)error {
    if (self.disposable.disposed) return;

    if (RACSIGNAL_ERROR_ENABLED()) {
        RACSIGNAL_ERROR(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description), cleanedDTraceString(error.description));
    }

    [self.innerSubscriber sendError:error];
}

与上面方法类似,调用sendError:事件。


- (void)sendCompleted {
    if (self.disposable.disposed) return;

    if (RACSIGNAL_COMPLETED_ENABLED()) {
        RACSIGNAL_COMPLETED(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description));
    }

    [self.innerSubscriber sendCompleted];
}

与上面方法类似,调用sendCompleted事件。


- (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable {
    if (disposable != self.disposable) {
        [self.disposable addDisposable:disposable];
    }
}

这里首先进行一个判断处理,不相等的情况下将disposable添加到_disposable中,其实这样做的目的还是将disposable交给订阅者RACSubscriber处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值