ReactiveCocoa 学习笔记二十一(RACPassthroughSubscriber & RACSubscriptingAssignmentTrampoline)

RACPassthroughSubscriber

RACPassthroughSubscriber 是 ReactiveCocoa 框架中的一个内部类,其遵循 协议,所以可以作为一个订阅者订阅信号流。但是,其只是作为一个中转,会将接收到的信号量转发为真正的订阅者。

- (instancetype)initWithSubscriber:(id)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;

你可能感兴趣的:(ReactiveCocoa,ReactiveCocoa)