響應式程式設計關注變化的傳播機制。它有三個關鍵詞:變化、傳播、機制。
響應式程式設計的源是個流;
響應式程式設計的源需要提供observable功能和響應鏈管理功能。
響應式程式設計的機制實際上是一個耦合和抽象的機制;
即事件和資訊的源怎麼與observer建立聯絡。
通常這個聯絡需要從兩個方面考察:
1、聯絡的建立機制;
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *)context API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0));
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
2、通訊的協議機制;
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context;
即抽象類(介面類):
observable<>---->observer;
抽象類observable提供observer管理功能;
observer提供通訊協議。
響應式程式設計的機制另一個需要解決的問題是變化監測和傳播驅動的問題。
---->變化--->傳播
- (void)willChangeValueForKey:(NSString *)key;
- (void)didChangeValueForKey:(NSString *)key;
解決方案有兩個:
1、手動改寫引起資料變更的set函式;
2、通過執行時或編譯時或其它機制自動改寫set函式;
總之:變化的監聽要通過資料的set函式來實現。
案例:
1、kvc機制通過isa swzzing機制來實現set的改寫;
2、事件分發機制通過訊息迴圈來監聽是否有事件,事件本身攜帶的資訊能夠定位到事件處理者,這就需要路由的功能。
事件的發起方將事件放到訊息佇列;
3、變化的設定不在使用set,而是使用機制提供的資訊設定函式統一設定;機制本身提供了資訊修改和訊息分發的功能。
監聽資料的分類:
1、監聽單個資料,且資料與其它資料無關聯;
2、監聽資料結構(類)中的單個資料;
3、監聽結構體,結構體中的任何一個元素變化都會引起通知。
4、監聽訊號,而不是資訊本身。