iOS--KVO的概述与使用

一、概述

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

二、使用方法

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 移除观察

三、实例:

  假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。

程序目录如下:

工程程序如下:

StockData.h


#import <Foundation/Foundation.h>

@interface StockData : NSObject
{
     NSString * stockName;
     float price;
}
@end

StockData.m


#import "StockData.h"
@implementation StockData

@end

这里定义属性是在ViewController.m文件里定义的,而ViewController.h里没有内容,故而没有列举出来。

ViewController.m


#import "ViewController.h"
#import "StockData.h"
@interface ViewController ()

@property(strong,nonatomic) UILabel *myLable;
@property(strong,nonatomic) StockData *stockforKVO;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.stockforKVO=[[StockData alloc] init];
    [self.stockforKVO setValue:@"searph" forKey:@"stockName"];
    [self.stockforKVO setValue:@"10.0" forKey:@"price"];
    [self.stockforKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    self.myLable = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
    self.myLable.textColor = [UIColor redColor];
    self.myLable.text = [NSString stringWithFormat:@"%@",[self.stockforKVO valueForKey:@"price"]];
    [self.view addSubview:self.myLable];

    UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    b.frame = CGRectMake(0, 0, 100, 30);
    b.backgroundColor=[UIColor redColor];
    [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:b];
}
-(void)buttonAction
{
    // 点击按钮 切换数值
    [self.stockforKVO setValue:[NSString stringWithFormat:@"%d",arc4random()%1000] forKey:@"price"];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

    if ([keyPath isEqualToString:@"price"]) {
        self.myLable.text= [NSString stringWithFormat:@"%@",[self.stockforKVO valueForKey:@"price"]];
        NSLog(@"旧数据--%@--,新数据--%@--",[change objectForKey:@"old"],[change objectForKey:@"new"]);
    }

}

/*
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
     if([keyPath isEqualToString:@"price"])
    {
          self.myLable.text=[NSString stringWithFormat:@"%@",[self.stockforKVO valueForKey:@"price"]];
    }
}
 */

/**
 *  移除观察者
 */
-(void)dealloc
{
    [self.stockforKVO removeObserver:self forKeyPath:@"price"];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

程序解析如下:

1.定义DataModel,即自己定义的类


//StockData.h#import <Foundation/Foundation.h>

@interface StockData : NSObject
{
     NSString * stockName;
     float price;
}
@end

//StockData.m
#import "StockData.h"
@implementation StockData

@end

2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边

- (void)viewDidLoad {
    [super viewDidLoad];
    self.stockforKVO=[[StockData alloc] init];
    [self.stockforKVO setValue:@"searph" forKey:@"stockName"];
    [self.stockforKVO setValue:@"10.0" forKey:@"price"];
    [self.stockforKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    self.myLable = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
    self.myLable.textColor = [UIColor redColor];
    self.myLable.text = [NSString stringWithFormat:@"%@",[self.stockforKVO valueForKey:@"price"]];
    [self.view addSubview:self.myLable];

    UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    b.frame = CGRectMake(0, 0, 100, 30);
    b.backgroundColor=[UIColor redColor];
    [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:b];
}

3.当点击button的时候,调用buttonAction方法,修改对象的属性

-(void)buttonAction
{
    // 点击按钮 切换数值
    [self.stockforKVO setValue:[NSString stringWithFormat:@"%d",arc4random()%1000] forKey:@"price"];
}

4. 实现回调方法

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

    if ([keyPath isEqualToString:@"price"]) {
        self.myLable.text= [NSString stringWithFormat:@"%@",[self.stockforKVO valueForKey:@"price"]];
        NSLog(@"旧数据--%@--,新数据--%@--",[change objectForKey:@"old"],[change objectForKey:@"new"]);
    }

}

/*
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
     if([keyPath isEqualToString:@"price"])
    {
          self.myLable.text=[NSString stringWithFormat:@"%@",[self.stockforKVO valueForKey:@"price"]];
    }
}
 */

5.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者

/**
 *  移除观察者
 */
-(void)dealloc
{
    [self.stockforKVO removeObserver:self forKeyPath:@"price"];
}

四、小结

KVO这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。

五、程序效果图

时间: 2024-10-21 06:02:01

iOS--KVO的概述与使用的相关文章

iOS KVO概述

iOS KVO概述 面试中经常会被问到:什么是KVO?这个问题既然出现概率这么大,那么我们就来详细讲一讲到底什么是KVO.下次再有面试官问你的时候,你就可以娓娓道来,以彰显高逼格 概述 问:什么是KVO? 答:KVO是Key-Value Observing的缩写.它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 如果你能这样回答,面试官一定不会说你错的,这就是KVO的原理.但是如果你能说出KVO

iOS Foundation 框架概述文档:常量、数据类型、框架、函数、公布声明

iOS Foundation 框架概述文档:常量.数据类型.框架.函数.公布声明 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的漂亮人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. Foundation 框架概述文档:常量.数据类型.框架.函数.

iOS:KVO/KVC 的概述与使用

KVO   APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 二,使用方法 系统框架已经支持KVO,所以程序员在使用的时候非常简单. 1. 注册,指定被观察者的属性, 2. 实现回调方法 3. 移除观察 三,实例: 假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其

iOS KVO概述及用法

KVO 什么是 KVO -->What 键值观察( Key-Value Observing) 是一种机制.这种机制允许当一个对象的某些属性的值被修改后会通知另外的观察改变化的对象.常用语 MVC 中 Model 与 Controller 之间的通信. 如何使用 KVO 使用方法分三步: 1. 注册,需要制定被观察的对象的属性 2. 实现回调的方法 3. 移除观察 (用完了,别忘记移除) 常用方法及数据类型的说明 //添加监听对象,并指定监听的 keyPath, 以及监听那些值的变化 - (voi

iOS系统框架概述

ios系统矿建概述 iOS操作系统是苹果为公司移动设备提供的操作系统,为方便应用开发者采用了先进的设计模式.采用了经典的MVC设计模式和框架模式.本篇文章我们主要关注iOS系统提供的框架,对MVC设计模式不做过多的描述. 我们通常称呼iOS的框架为Cocoa Touch框架,Cocoa Touch是一个框架的集合,里面包含了众多的子框架.每一个子框架都是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像.声音文件等其他资源,共享资源库定义应用程序可以调用的函数和方法.框架

KVO 的概述与使用

参考:http://blog.csdn.net/yuquan0821/article/details/6646400/ 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 二,使用方法 系统框架已经支持KVO,所以程序员在使用的时候非常简单. 1. 注册,指定被观察者的属性, 2. 实现回调方法 3. 移除观察(ARC不需要) 三,实例

iOS KVO使用方法

KVO(Key Value Observing)其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属性值改变之后作为监听器 的视图组件就会被激发,激发时就会回调监听器自身.在ObjC中要实现KVO则必须实现NSKeyValueObServing协议,不过幸运的是 NSObject已经实现了该协议,因此几乎所有的ObjC对象都可以使用KVO. 在ObjC中使用KVO操作常用的方法如下: 注册指定Key路径的监听器: addObserver: forKeyPath: o

KVO的概述与使用

一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 二,使用方法 系统框架已经支持KVO,所以程序员在使用的时候非常简单. 1. 注册,指定被观察者的属性, 2. 实现回调方法 3. 移除观察 三,实例: 假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格. 1.定义DataModel, @interfa

ios kvo 简介

在一个复杂的,有状态的系统中,当一个对象的状态发生改变,如何通知系统,并对状态改变做出相应的行为是必需考虑的一个问题,在iOS中为这类问题提供了4种解决方法: 1. NSNotifiactaion和NSNotificationCenter:通知中心 2. Delegates:代理, 3. Callback:回调, 4. KVO(Key-Value Observing):键值观察 这篇文章就来说说通过KVO通知系统状态发生改变的用法. KVO是什么? KVO是Object-C中定义的一个通知机制,

iOS KVO详解

一.KVO 是什么? KVO 是 Objective-C 对观察者设计模式的一种实现.[另外一种是:通知机制(notification),详情参考:iOS 趣谈设计模式--通知]: KVO 提供一种机制,指定一个被观察对象(例如 A 类),当对象某个属性(例如 A 中的字符串 name)发生更改时,对象会获得通知,并作出相应处理:[且不需要给被观察的对象添加任何额外代码,就能使用 KVO 机制] 在 MVC 设计架构下的项目,KVO 机制很适合实现 mode 模型和 view 视图之间的通讯.