RACPassthroughSubscriber
RACPassthroughSubscriber 是 ReactiveCocoa 框架中的一个内部类,其遵循 <RACSubscriber>
协议,所以可以作为一个订阅者订阅信号流。但是,其只是作为一个中转,会将接收到的信号量转发为真正的订阅者。
- (instancetype)initWithSubscriber:(id<RACSubscriber>)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable;
- subscriber 是真正的订阅者,不能为空
- signal 是传递信号量的信号流
- disposable 若是已经清理,那么该类将不再转发信号量
RACSubscriptingAssignmentTrampoline
RACSubscriptingAssignmentTrampoline 类可以为指定对象的指定属性绑定一个信号流,每当信号流传递信号量时,便为该属性赋值。
该类提供了一个初始化方法,含有两个参数,一个是指定的对象,一个是当传递的信号量是 nil 时,属性会设置的值。
- (nullable instancetype)initWithTarget:(nullable id)target nilValue:(nullable id)nilValue;
但是,不必直接使用这个类,框架中提供了一个宏,十分方便。
#define RAC(TARGET, ...) \
metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \
(RAC_(TARGET, __VA_ARGS__, nil)) \
(RAC_(TARGET, __VA_ARGS__))
#define RAC_(TARGET, KEYPATH, NILVALUE) \
[[RACSubscriptingAssignmentTrampoline alloc] initWithTarget:(TARGET) nilValue:(NILVALUE)][@keypath(TARGET, KEYPATH)]
使用 RAC(TARGET, …) 宏,该宏可以提供2个或3个参数,使用方法如下例子:
RAC(self, objectProperty) = objectSignal;
RAC(self, stringProperty, @"foobar") = stringSignal;
RAC(self, integerProperty, @42) = integerSignal;