上一节中讲了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
处理。