前言
作为IOS初学者,分析的深度非常有限,所以本文更像是学习笔记,欢迎批评指正。
原理
RACObserve是个宏,RACObserve(TARGET, KEYPATH)
最终是执行[target_ rac_valuesForKeyPath:@keypath(TARGET, KEYPATH) observer:self];
。这就牵出NSObject (RACPropertySubscribing)
Category。
NSObject (RACPropertySubscribing)
- (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(__weak NSObject *)observer;
内部调用了- (RACSignal *)rac_valuesAndChangesForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)observer
。其中options参数为NSKeyValueObservingOptionInitial
。所以RACObserve创建的Signal 会立即发送被观察者的初始值。
- (RACSignal *)rac_valuesAndChangesForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)observer
中可以看出。如果target为nil,返回一个空的Signal。如果target或者observer将要被回收,Signal也将被终止。
然后- (RACSignal *)rac_valuesAndChangesForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)observer
又调用了NSObject (RACKVOWrapper)
Category中的- (RACDisposable *)rac_observeKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)observer block:(void (^)(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent))block;
方法。
NSObject (RACKVOWrapper)
NSObject (RACKVOWrapper)
Category提供了KVO基于Block的接口,实现上依赖RACKVOTrampoline
。
RACKVOTrampoline
RACKVOTrampoline
实现了Delegate到Block的转变。它作为中间人,实现- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
方法,然后通过Block的方式把变化传递出去。RACKVOTrampoline中还用到了RACKVOProxy
。
RACKVOProxy
它将维护KVO中Observer与Context之间的对应关系,变化来临时,查找关系表,把变化传递给对应的Observer,也是RACKVOTrampoline.