從源碼角度分析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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章