响应式编程关注变化的传播机制。它有三个关键词:变化、传播、机制。
响应式编程的源是个流;
响应式编程的源需要提供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、监听信号,而不是信息本身。