前言
作爲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.