KVO机制由NSKeyValueObserving协议提供支持,NSObject遵守该协议,因此NSObject的子类都可以使用该协议中的方法,所有Object-c类都是NSObject的子类。。
该协议包含了如下方法用以注册监听器:
addObserver:forKeyPath:option:context:-------注册一个监听器用以监听指定的key路径,
removeObserver:forKeyPath-----为key路径删除指定的监听器
removeObserver:forKeyPath:context------为key路径删除指定的监听器
使用----通过视图组件监听数据模型的变化,当数据模型组件的key路径对应的属性值发生变化时,作为监听器的视图组件就会被激发,激发时就会回调监听器本身的监听方法=:
observerValueForKeyPath:ofOBject:change:context:
步骤如下:为被监听对象注册监听器;重写监听器的observeValueForKeyPath:ofObject:change:context:
简单实用案例:
#import <Foundation/Foundation.h>
#import "Item.h"
@interface ItemView:NSobject
@property (nonatomic,weak) Item* item;
-(void) showItemInfo;
@end
#import "ItemView.h"
@implementtation ItemView
-(void) showItemInfo(){
}
//重写setItem方法
-(void) setItem:(Item*) item{
self->_item=item;
//添加监听
[self.item addObserver:self forKeyPath:@"name"options:NSKeyValuesObservingOptionNewcontext:nil];
[self.item addObserver:self forKeyPath:@"price"options:NSKeyValueObservingOptionNewcontext;nil];
}
//监听的回调方法
-(void)observeValuesForKeyPath:(NSString*)keyPathofObject:(id)object change:(NSDictionary*)changecontext;(void*)context{
NSLog(@"修改的keypath%@",keyPath);
NSLog(@"修改的对象%@",object);
}
//删除监听器
-(void)dealloc{
[self.item removeObserver:self forKeyPath:@"name"];
[self.item removeObserver:self forKeyPath:@"price"];
}
@end