1.使用和基本方法介绍
- 全称:Key Value Observing(键值监听)
- 步骤:
1. 添加观察者
/** addObserver
* 为对象p添加一个观察者(监听器)
*
* @param Observer 观察者(监听器)
* @param KeyPath 属性名(需要监听哪个属性)
* @param options 改变的值
* @param context 当初addObserver时的context参数值
*/
[p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];
2.移除观察者(不确定什么时候该移除,就在代理对象的dealloc方法中移除)
[p removeObserver:self forKeyPath:@"name"];
3.监听变化
/** observeValueForKeyPath
* 当利用KVO监听到某个对象的属性值发生了改变,就会自动调用这个
*
* @param keyPath 哪个属性被改了
* @param object 哪个对象的属性被改了
* @param change 改成咋样
* @param context 当初addObserver时的context参数值
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@ %@ %@ %@", object, keyPath, change, context);
}
2. 使用示例
- (void)viewDidLoad{
[super viewDidLoad];
// /** 通过KVO监听 */
for(FZQWine* wine in self.wine){
[wine addObserver:self forKeyPath:@"amount" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}
}
/** KVO监视数量变化 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(FZQWine*)wine change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
/** 取出数值 */
int oldAmount = [change[NSKeyValueChangeOldKey] intValue];
int newAmount = [change[NSKeyValueChangeNewKey] intValue];
/** 加入购物车或移出购物车 */
[self changeCart:wine];
/** 根据变化计算总价 */
NSString *shop;
//判断改变情况
if (newAmount>oldAmount) {
shop = @"plus";
}else{
shop = @"minus";
}
[self totalPriceCal:wine change:shop];
}
- (void)dealloc {
// 移除监听
for(FZQWine* wine in self.wine)
{
[wine removeObserver:self forKeyPath:@"amount"];
}
}
3. KVO模式-自动通知和手动通知
cocoa的KVO模型中,有两种通知观察者的方式,自动通知和手动通知。顾名思义,自动通知由cocoa在属性值变化时自动通知观察者,而手动通知需要在值变化时调用 willChangeValueForKey:和didChangeValueForKey: 方法通知调用者。为求简便,我们一般使用自动通知。
4. 其他参考资料