我理解的观察者模式:一个对象将自己的某一个属性委托给另外一个对象监测,并作出响应的行为。
添加观察者
/**
* 添加观察者
*
* @param observer 观察者 谁去观察
* @param keyPath 被观察的属性
* @param options 选择观察的条件
* @param context 上下文
*/
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
观察者需要在移除,避免没有办法销毁当前对象 在- (void)dealloc;里面执行
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *)context NS_AVAILABLE(10_7, 5_0);
观察代理
/**
* 观察代理方法
*
* @param keyPath 被观察的属性
* @param object 被观察者
* @param change 属性改变字典
* @param context 上下文
*/
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSString*, id> *)change context:(nullable void *)context;
在change字典中通过以下key值获取被观察者的属性值
FOUNDATION_EXPORT NSString *const NSKeyValueChangeKindKey;
//新值
FOUNDATION_EXPORT NSString *const NSKeyValueChangeNewKey;
//旧值
FOUNDATION_EXPORT NSString *const NSKeyValueChangeOldKey;
FOUNDATION_EXPORT NSString *const NSKeyValueChangeIndexesKey;
FOUNDATION_EXPORT NSString *const NSKeyValueChangeNotificationIsPriorKey NS_AVAILABLE(10_5, 2_0);