Objective-C:KVO机制

KVO:key value observer 键值对的观察者

功能:给对象属性添加观察者,用来时时监测对象属性值的改变,一旦属性值发生了改变,观察者就做出相应的反应,提醒用户。在应用中,针对MVC模式,数据库中的数据模型发生变化时,引起视图界面的改变,此时使用KVO进行数据的监测是一个不错的机制。

步骤:

1.添加观察者

2.接收变动通知

3.删除观察者

详细介绍:

键值通知枚举

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"];
}

演示结果如下:

点击第一次,输出股票价格更新即时信息

2015-10-14 22:02:56.298 02-KVO[5612:319932] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
    kind = 1;
    new = "12.6";
    old = "12.5";
}

点击第二次,输出股票价格更新即时信息

2015-10-14 22:02:56.298 02-KVO[5612:319932] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
    kind = 1;
    new = "12.6";
    old = "12.5";
}
2015-10-14 22:03:44.913 02-KVO[5612:319932] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
    kind = 1;
    new = "12.70000038146973";
    old = "12.6";
}

点击第三次,输出股票价格更新即时信息

2015-10-14 22:02:56.298 02-KVO[5612:319932] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
    kind = 1;
    new = "12.6";
    old = "12.5";
}
2015-10-14 22:03:44.913 02-KVO[5612:319932] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
    kind = 1;
    new = "12.70000038146973";
    old = "12.6";
}
2015-10-14 22:04:09.448 02-KVO[5612:319932] keyPath:_price,object:<Stock: 0x7f9679482c40>,change:{
    kind = 1;
    new = "12.80000076293945";
    old = "12.70000038146973";
}
时间: 2024-10-06 21:08:53

Objective-C:KVO机制的相关文章

KVO机制

#import <Foundation/Foundation.h>#import "Person.h"#import "BankAccount.h" int main(int argc, const char * argv[]){ //    实例化一个人, 表示是这个名字叫wangdelong的人, 准备在银行开户        Person *person = [[Person alloc] init];        [email protecte

iOS开发之KVO机制的妙用

压抑不住激动得心情,趁着今天时间多,我就全部拿来写博客好了,当然,不吹牛逼了.吹多了,写不出来代码怎么办呢. 前言:还记得当我接到自己第一个项目的时候,首页的collectionview的frame一直定不好,总会出现collectionview太大了,或者底层的scrollview的contentsize太小了.这些通过小调frame都可以实现不会挡住.但是,后来当客户提出要加上热卖推荐字段的时候 我就懵了.怎么来实现呢,还要保证在collectionview底部有------END-----

KVO机制浅析和实例演示

什么是KVO? KVO是Key-Value-Observing的缩写,通过KVO这种机制对象可以通过它得到其他对象的某个属性的变更通知.这种机制在MVC模式下显得更为重要,KVO可以让视图对象经过控制器观察模型对象的变更从而做出更新等操作. KVO这一机制是基于NSKeyValueObserving协议的,Cocoa通过这个协议为所有遵循协议的对象提供了自动观察属性变化的能力.在NSObject中已经为我们实现了这一协议,所以我们不必去实现这个协议. 下图形象的表示了KVO的一种工作流程: 为什

转:KVC与KVO机制

由于Objective-C是基于Smalltalk进行设计的,所以它具有动态加载.动态绑定等特性.Key-value coding (KVC) 和 key-value observing (KVO) 是两种能让我们驾驭 Objective-C 动态特性并简化代码的机制. 1.KVC 在ObjC的编程中,我们习惯于通过属性的set和get方法来对属性的值进行读写,其实由于ObjC的语言特性,你根本不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Value Coding(简称KVC).

iOS核心笔记—KVO机制

1.KVO KVO简介:Key Value Observing,通过Key键观察对象的对应Key键的属性值Value是否发生改变. KVO的作用: 当前对象想监听另一个对象的某个属性是否发生变化. KVO使用步骤:①给对象的某个属性添加监听器:②监听器实现监听方法:③对象销毁前一定要移除监听器. 当前对象监听另一个对象的某个属性: [person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionN

iOS开发-由谈KVC、KVO(重点观察者模式)机制编程

一 不小心,小明在<跟着贝尔去冒险>这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文 化外,还是镜头少普通话跟小明一样烂的Laughing Sir那种冷静和沉着稳定留下了深刻印象,不由想起电视剧<学警狙击>中为了不暴露钟立文的身份,要求向自己补一枪的警匪卧底巅峰推动者 --Laughing 哥.那么,卧底这样的工作,在我们程序里有没有呢?答案是肯定的,观察者模式. 文章内容思维导图 一.基本概念 1)KVC概念 KVC

观察者模式的具体应用——通知(notification)机制和KVO(Key-Value-Observing)机制

在Cocoa Touch框架中,观察者模式的具体应用有两个——通知(notification)机制和KVO(Key-Value-Observing)机制. 1.通知机制. 在iOS中通知主要有以下三种:广播通知.本地通知和推送通知.本文所说的通知是广播通知,广播通知除了名字和后两者相似之外其他完全不同.广播通知是Cocoa Touch框架中实现观察者模式的一种机制,它可以在一个应用内部的多个对象之间发送消息:本地通知和推送通知是给用户一种提示,比如警告对话框.发出声音.震动或者在应用图标上面显示

OC常用设计模式、机制之KVO

KVO http://blog.kyleduo.com/2014/10/20/ios_learning-kvo/ 定义: KVO:Key-Value Observing,是Foundation框架提供的一种机制,使用KVO,可以让       观察者(Observing)        方便地对 指定对象(Object)   的   指定属性(Key)    进行观察,当属性发生变化       <如值(Value)变化时>    时,观察者  会被通知. 使用:KVO只需要两个步骤: 注册O

OC之KVC,KVO

KVO简介 在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步.这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映模型的变化:当用户和控制器交互的时候,模型也应该做出相应的改变. KVO 能帮助我们让视图和模型保持同步.控制器可以观察视图依赖的属性变化. 1.使用: 1.1.注册与解除注册 NSKeyValueObserverRegistration 的 category 方法将观察者对象与被观察者对象注册与解