您的位置:首页 > 移动开发 > IOS开发

ios kvo

2015-09-16 16:37 405 查看
kvo就是key value observing(键值监听)

KVO其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属性值改变之后作为监听器的视图组件就会被激发,激发时就会回调监听器自身。在ObjC中要实现KVO则必须实现NSKeyValueObServing协议,不过幸运的是NSObject已经实现了该协议,因此几乎所有的ObjC对象都可以使用KVO。

在ObjC中使用KVO操作常用的方法如下:

注册指定Key路径的监听器: addObserver: forKeyPath: options: context:

删除指定Key路径的监听器: removeObserver: forKeyPathremoveObserver: forKeyPath: context:

回调监听: observeValueForKeyPath: ofObject: change: context:

KVO的使用步骤:

通过addObserver: forKeyPath: options: context:为被监听对象(它通常是数据模型)注册监听器
重写监听器的observeValueForKeyPath: ofObject: change: context:方法

下面是一个例子:
假如有一个person类,person类里面一个book属性,Book也是一个类,Book里面有一个name属性

@implementation Person

//添加观察者

- (void)setBook:(Book *)book{

_book = book;

[self.book addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

}

//name属性改变时会调用该方法---------该方法是实现的NSKeyValueObServing协议中得方法,因为所有类都遵守NSKeyValueObServing协议

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

if ([keyPath isEqualToString:@"name"]) {

NSLog(@"keyPath=%@,object=%@,newValue=%@,context=%@",keyPath,object,change[@"new"],context);

}

}

//移除观察者

- (void)dealloc{

[self.book removeObserver:self forKeyPath:@"name"];

}

@end

//main方法

int main(int argc, const char * argv[]) {

@autoreleasepool {

Book *book = [[Book alloc] init];

book.name = @"葵花宝典";



Person *person = [[Person alloc] init];



person.book = book;

book.name = @"红楼梦";

book.name = @"西游记";

}

return 0;

}

结果是会有两次打印输出,因为book.name改变了两次
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: