背景

RAC 提供了一个方法- (RACSignal *)rac_signalForSelector:(SEL)selector; ,那么只要向对象发送selector方法,这个signal就会被催发执行next的block。

举例:

RWTest *t = [[RWTest alloc] init];
[[t rac_signalForSelector:@selector(hello:)] subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];
[t hello:@"world"];

subscribeNext的block会在执行完原来的方法实现之后调用。这个方法很重要,RAC添加的很多系统类别方法都是基于这个来实现的,比如UIAlertView (RACSignalSupport)中的rac_buttonClickedSignal方法。那么这个方法是如何实现的呢? 有以下几点需要注意:

  1. 一个对象对同一个selector可以多次调用rac_signalForSelector
  2. 不能直接替换selector的实现,因为新创建的对象还应该调用以前的实现不应该调用这个subscribeNext block
  3. 要保持原始的实现,因为因为不能影响原有的功能

总之要找到一种方法拦截到selector消息的发送。通过源码分析我们看看RAC是如何做到的。

rac_signalForSelector只不过是对NSObjectRACSignalForSelector的简单封装,只看NSObjectRACSignalForSelector即可。原理图如下:

原理图