ReactiveCocoa 学习笔记二十(RACDelegateProxy & RACKVOProxy & RACValueTransformer)

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值