从源码角度分析RACObserve的实现原理(一)

前言

作为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.

猜你喜欢

转载自blog.csdn.net/fly1183989782/article/details/52268203
今日推荐