Objective-C:KVO机制
typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) {
NSKeyValueObservingOptionNew = 0x01,
NSKeyValueObservingOptionOld = 0x02,
NSKeyValueObservingOptionInitial = 0x04,
NSKeyValueObservingOptionPrior= 0x08
};
内置的通知键
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 ;
@interface NSObject(NSKeyValueObserving)
//接受被观察者发出变动后的通知
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
@end
@interface NSObject(NSKeyValueObserverRegistration)
//通过键给对应的属性添加观察者
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
//删除观察者
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context;
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
@end
@interface NSArray(NSKeyValueObserverRegistration)————— 数组的KVO机制
NSIndexSet 是个无符号整数集合。集合中的元素不可变的、不可重复。常被用来当作索引使用
//通过键给对应的数组中指定索引的属性添加观察者
- (void)addObserver:(NSObject *)observer toObjectsAtIndexes:(NSIndexSet *)indexes forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
//删除观察者
- (void)removeObserver:(NSObject *)observer fromObjectsAtIndexes:(NSIndexSet *)indexes forKeyPath:(NSString *)keyPath context:(void *)context;
- (void)removeObserver:(NSObject *)observer fromObjectsAtIndexes:(NSIndexSet *)indexes forKeyPath:(NSString *)keyPath;
//通过键给对应的数组添加观察者
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
//删除观察者
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context;
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
@end
@interface NSSet(NSKeyValueObserverRegistration)—————集合的KVO机制
//通过键给对应的set集合添加观察者
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
//删除观察者
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context;
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
@end
@interface NSObject(NSKeyValueObserverNotification)————观察者通知
//对于单个对象
- (void)willChangeValueForKey:(NSString *)key;
- (void)didChangeValueForKey:(NSString *)key;
//对于array数组
- (void)willChange:(NSKeyValueChange)changeKind valuesAtIndexes:(NSIndexSet *)indexes forKey:(NSString *)key;
- (void)didChange:(NSKeyValueChange)changeKind valuesAtIndexes:(NSIndexSet *)indexes forKey:(NSString *)key;
//对于set集合
- (void)willChangeValueForKey:(NSString *)key withSetMutation:(NSKeyValueSetMutationKind)mutationKind usingObjects:(NSSet *)objects;
- (void)didChangeValueForKey:(NSString *)key withSetMutation:(NSKeyValueSetMutationKind)mutationKind usingObjects:(NSSet *)objects;
@end
具体演示实例如下:
要求:将人设置为股票的观察者,一旦股票价格发生改变,就立刻发送即时信息。
准备工作:
在控制器视图中添加一个按钮控件并关联事件IBAction,用来点击时改变股票的价格,需要的文件相关截图为:


以下就是代码的实现了:
Person人类:
Person.h
//声明属性
#import <Foundation/Foundation.h> @interface Person : NSObject
{
NSString *_name;
}
@end
Perosn.m
//接受观察者发来的即时信息
#import "Person.h" @implementation Person //接收被观察者发生变动后的通知
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath:%@,object:%@,change:%@",keyPath,object,change);
}
@end
Stock股票类:
Stock.h
//声明属性
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> @interface Stock : NSObject
{
NSString *_name;
CGFloat _price;
}
@end
ViewController控制器类
//声明属性
#import "ViewController.h"
#import "Person.h"
#import "Stock.h" @interface ViewController ()
@property (strong,nonatomic)Person *person;
@property (strong,nonatomic)Stock *stock;
@end @implementation ViewController
//按钮事件,点击时改变股票的价格
//按钮事件,改变股票价格
- (IBAction)buttonClicked:(UIButton *)sender
{
CGFloat price = [[self.stock valueForKey:@"_price"] floatValue]; [self.stock setValue:@(price+0.1) forKey:@"_price"];
}
//创建对象并添加观察者
- (void)viewDidLoad {
[super viewDidLoad];
//创建人和股票对象
self.person = [[Person alloc]init];
[self.person setValue:@"Tom" forKey:@"_name"];
self.stock = [[Stock alloc]init];
[self.stock setValue:@"sh0001" forKey:@"_name"];
[self.stock setValue:@12.5 forKey:@"_price"];
//添加观察者(观察股票的变动)
[self.stock addObserver:self.person forKeyPath:@"_price" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
//程序结束,删除观察者
-(void)dealloc
{
//删除观察者
[self.stock removeObserver:self.person forKeyPath:@"_price"];
}
演示结果如下:
点击第一次,输出股票价格更新即时信息
-- ::56.298 -KVO[:] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
kind = ;
new = "12.6";
old = "12.5";
}
点击第二次,输出股票价格更新即时信息
-- ::56.298 -KVO[:] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
kind = ;
new = "12.6";
old = "12.5";
}
-- ::44.913 -KVO[:] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
kind = ;
new = "12.70000038146973";
old = "12.6";
}
点击第三次,输出股票价格更新即时信息
-- ::56.298 -KVO[:] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
kind = ;
new = "12.6";
old = "12.5";
}
-- ::44.913 -KVO[:] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
kind = ;
new = "12.70000038146973";
old = "12.6";
}
-- ::09.448 -KVO[:] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
kind = ;
new = "12.80000076293945";
old = "12.70000038146973";
}
Objective-C:KVO机制的更多相关文章
- KVO机制浅析和实例演示
什么是KVO? KVO是Key-Value-Observing的缩写,通过KVO这种机制对象可以通过它得到其他对象的某个属性的变更通知.这种机制在MVC模式下显得更为重要,KVO可以让视图对象经过控制 ...
- 转:KVC与KVO机制
由于Objective-C是基于Smalltalk进行设计的,所以它具有动态加载.动态绑定等特性.Key-value coding (KVC) 和 key-value observing (KVO) ...
- KVO机制
KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用来监测对象的某些属性的实时变化情况并作出响应 首先,假设我们的目标是在一个UITableViewController内 ...
- iOS 常用设计模式和机制之KVO
KVO http://blog.kyleduo.com/2014/10/20/ios_learning-kvo/ 定义: KVO:Key-Value Observing,是Foundation框架提供 ...
- 谈KVC、KVO(重点观察者模式)机制编程
一不小心,小明在<跟着贝尔去冒险>这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文化外,还是镜头少普通话跟小明一样烂的Lau ...
- [深入浅出Cocoa]详解键值观察(KVO)及其实现机理
一,前言 Objective-C 中的键(key)-值(value)观察(KVO)并不是什么新鲜事物,它来源于设计模式中的观察者模式,其基本思想就是: 一个目标对象管理所有依赖于它的观察者对象,并在它 ...
- OC之KVC,KVO
KVO简介 在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步.这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映 ...
- iOS---观察者模式之--->KVO
文章结构如下: Why? (为什么要用KVO) What? (KVO是什么) How? ( KVO怎么用) More (更多细节) 原理 自己实现KVO 在我的上一篇文章浅谈 iOS Notifica ...
- 11. KVC And KVO
1. KVC And KVO 的认识 KVC/KVO是观察者模式的一种实现 KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...
随机推荐
- POJ-1410
Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12817 Accepted: 3343 Des ...
- python读写hdf5及cdf格式文件
Python write and read hdf5 file http://stackoverflow.com/questions/20928136/input-and-output-numpy-a ...
- hdu 多校第一场
1001 思路:打表可以发现只有3|n 和 4|n 的情况有解,判一下就好啦. #include<bits/stdc++.h> #define LL long long #define f ...
- webpack配置点记录
jsx语法需要用到babel-preset-react: 通用babel-loader相关如下: 以上配置还只能针对ES6情况,static defaultProps是ES7的特性,需要引入新的配置:
- 丑数(LintCode)
丑数 设计一个算法,找出只含素因子3,5,7 的第 k大的数. 符合条件的数如:3,5,7,9,15...... 您在真实的面试中是否遇到过这个题? Yes 样例 如果k=4, 返回 9 挑战 要求时 ...
- Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana(分块)
E. GukiZ and GukiZiana time limit per test 10 seconds memory limit per test 256 megabytes input stan ...
- Redux-react connect 源码自己重写
import Counter from '../components/Counter'; import { increment, decrement, incrementIfOdd, incremen ...
- 对Webservice的理解
eb Service使用的是 SOAP (Simple Object Access Protocol)协议 soap协议只是用来封装消息用的.封装后的消息你可以通过各种已有的协 ...
- 【DFS】STAMPS
[Poj1010]STAMPS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18867 Accepted: 5469 ...
- 【二分】Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale
当m>=n时,显然答案是n: 若m<n,在第m天之后,每天粮仓减少的量会形成等差数列,只需要二分到底在第几天,粮仓第一次下降到0即可. 若直接解不等式,可能会有误差,需要在答案旁边扫一下. ...