入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

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

创建时间:2016-08-21 投稿人: 浏览次数:1404

前言

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

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像