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: forKeyPath、removeObserver: 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改变了两次
KVO其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属性值改变之后作为监听器的视图组件就会被激发,激发时就会回调监听器自身。在ObjC中要实现KVO则必须实现NSKeyValueObServing协议,不过幸运的是NSObject已经实现了该协议,因此几乎所有的ObjC对象都可以使用KVO。
在ObjC中使用KVO操作常用的方法如下:
注册指定Key路径的监听器: addObserver: forKeyPath: options: context:
删除指定Key路径的监听器: removeObserver: forKeyPath、removeObserver: 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改变了两次
相关文章推荐
- iOS开发之多线程入门 及NSThread
- 【IOS开发】如何画1像素的线
- IOS GDataXML 解析xml
- iOS 延时的几种方法
- iOS开发之旅--NSRunLoop 详解
- iOS雷达和类似水波纹效果的实现
- IOS开发---企业版打包发布
- iOS 音频播放的几种方法
- IOS常用代码
- IOS中定时器NSTimer的开启与关闭
- 蓝懿学习之考试受挫
- iOS蓝牙开发(一)蓝牙相关基础知识
- iOS视频拍摄与压缩
- 使用 fastlane 实现 iOS 持续集成
- 集成支付宝钱包支付iOS SDK的方法与经验
- iOS学习 很有用的链接
- IOS视频压缩
- ios经典博客地址
- iostat samples
- IOS开发(转自知乎)