RACDelegateProxy
RACDelegateProxy 是 ReactiveCocoa 框架内部使用的类,它作为一个中间层,封装了一个代理实例。
- (instancetype)initWithProtocol:(Protocol *)protocol;
在使用上面的方法创建一个中间代理对象时,需要提供代理遵循的协议,相应的调用下面的方法时,所提供的方法应当属于该协议。
- (RACSignal *)signalForSelector:(SEL)selector {
return [self rac_signalForSelector:selector fromProtocol:_protocol];
}
参见 NSObject 的 RACSelectorSignal 分类。
需要明白的是,该 RACDelegateProxy 类并不会实现协议中的任何方法,真正实现相应方法的代理保存在下面的属性中。
@property (nonatomic, unsafe_unretained) id rac_proxiedDelegate;
该类重写了 NSObject 中的一些方法,当 signalForSelector: 方法并不能处理相关任务时,可以将任务转发给代理对象。
- (void)forwardInvocation:(NSInvocation *)invocation {
[invocation invokeWithTarget:self.rac_proxiedDelegate];
}
RACKVOProxy
RACKVOProxy 类有点类似 RACDelegateProxy 类,但是该类共享一个实例,作为一个代理保存着真正的监听者。
+ (instancetype)sharedProxy;
- (void)addObserver:(__weak NSObject *)observer forContext:(void *)context;
- (void)removeObserver:(NSObject *)observer forContext:(void *)context;
该类中,声明了一个 NSMapTable 实例用来保存所有的监听者,所以在使用上面的方法时,参数 context 一定要是唯一的。
@property (strong, nonatomic, readonly) NSMapTable *trampolines;
当该类作为监听者监听到相应的属性发生变化时,便会响应下面的方法,从而将消息传递给真正的监听者。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSValue *valueContext = [NSValue valueWithPointer:context];
__block NSObject *trueObserver;
dispatch_sync(self.queue, ^{
trueObserver = [self.trampolines objectForKey:valueContext];
});
if (trueObserver != nil) {
[trueObserver observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
RACValueTransformer
RACValueTransformer 是 NSValueTransformer 的子类,提供了一个方法,用来创建一个值转换器。
+ (instancetype)transformerWithBlock:(id (^)(id value))block {
NSCParameterAssert(block != NULL);
RACValueTransformer *transformer = [[self alloc] init];
transformer.transformBlock = block;
return transformer;
}
其转换值的方法实际是创建时传递的 block 块参数,并且不支持反向转换。
- (id)transformedValue:(id)value {
return self.transformBlock(value);
}