浅谈iOS里面的KVO模式

本文转自:http://blog.csdn.net/yuquan0821/article/details/6646400/

一,概述

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

二,使用方法

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

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

2. 实现回调方法

3. 移除观察

三,实例:

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

1.定义StockData

#import <Foundation/Foundation.h>

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


1

2

3

4

5

#import "StockData.h"

@implementation StockData

@end

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


1

2

3

4

@interface ViewController ()

@property(nonatomic,strong)StockData *stcokForKVO;

@property(nonatomic,strong)UILabel *mylabel;

@end


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

- (void)viewDidLoad {

    [super viewDidLoad];

    self.stcokForKVO=[[StockData alloc]init];

    [self.stcokForKVO setValue:@"searph" forKey:@"stockNmae"];

    [self.stcokForKVO setValue:@"10.0" forKey:@"price"];

    [self.stcokForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

    

    self.mylabel=[[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30)];

    self.mylabel.textColor=[UIColor redColor];

    self.mylabel.text= [NSString stringWithFormat:@"%@",[self.stcokForKVO valueForKey:@"price"]];

    [self.view addSubview:self.mylabel];

    

    UIButton *b=[UIButton buttonWithType:UIButtonTypeRoundedRect];

    b.frame=CGRectMake(50, 50, 100, 30);

    b.backgroundColor=[UIColor blueColor];

    [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:b];

    

}

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

-(void)buttonAction{
    [self.stcokForKVO 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.mylabel.text= [NSString stringWithFormat:@"%@",[self.stcokForKVO valueForKey:@"price"]];
        NSLog(@"旧数据--%@--,新数据--%@--",[change objectForKey:@"old"],[change objectForKey:@"new"]);
    }

}

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

-(void)dealloc{

    [self.stcokForKVO removeObserver:self forKeyPath:@"price"];
}
时间: 2024-10-11 06:55:18

浅谈iOS里面的KVO模式的相关文章

JavaScript:浅谈iOS与H5的交互-JavaScriptCore框架

JavaScript:浅谈iOS与H5的交互-JavaScriptCore框架 前言 小的作为一个iOS程序猿,可能研究JavaScript以及H5相关的知识并不是为了真正的要去转行做这一方面,其实更多的为了要研究OC中的JavaScriptCore框架,JavaScriptCore框架主要是用来实现iOS与H5的交互.当然了,最早我曾经写过iOS浅谈webView的JS一种用法.(去掉web显示页的广告),这种算得上最简单的iOS与H5的交互了.现在混合编程越来越多,H5的相对讲多,所以研究J

浅谈php设计模式(1)---工厂模式

一.接口继承直接调用 先看看这样一段代码: 1 <?php 2 3 interface db{ 4 function conn(); 5 } 6 7 class dbmysql implements db { 8 public function conn(){ 9 echo "连接到了mysql"; 10 } 11 } 12 13 class dbsqlite implements db{ 14 public function conn(){ 15 echo "连接到了

浅谈设计模式3-模板方法模式

模版方法模式,个人认为还是用处比较多的一个设计模式,而且也是比较好学和理解的一个.依然来通过模拟一个场景来慢慢了解. 现在我们来实现一下泡茶这个过程.首先我们需要烧开一壶水,然后往茶壶中放茶叶,加入开水,等待茶泡好. 经过前两次的分享,大家应该具备了基本的面向对象的思想了,这里就不再用面向过程的方式演示了. 首先,有一种普通人,他泡茶的方式是这样的 public class Common     { public void MakeTea()         {             Heat

浅谈JavaScript中的原型模式

在JavaScript中创建对象由很多种方式,如工厂模式.构造函数模式.原型模式等: <pre name="code" class="html">//工厂模式 function createPerson(name,age,job) { var o = new Object; o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); } retur

浅谈iOS中MVVM的架构设计与团队协作【转载】

今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人了. 说到架构设计和团队

IOS中 浅谈iOS中MVVM的架构设计与团队协作

今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与

浅谈iOS中的RunLoop

首先解释下为什么是浅谈,主要是RunLoop这个东西不单单是iOS的范畴,还涉及到操作系统,我指的浅谈仅仅针对ios上层应用,底层的东西概不涉及 ,所以只能浅谈浅谈了. 在浅谈RunLoop之前我们来写个小demo,超级简单,一个按钮,然后给按钮一个断点 这块标记了1,2,3,4 红色的字:其实这是这个APP启动的一个过程 但是说好了浅谈RunLoop为啥又扯到APP的启动了 ? 先不要在意这些细节... 我先来解释下我标出的1,2,3,4分别是啥东西 1,dyld :这是啥子鬼了? the d

浅谈iOS面试所遇问题

今天面试的公司之前在百科搜索了解了一些信息,一家专业拉手媒体运营商,付费通方便了用户出行,很喜欢公司的氛围. 言归正传,面对面试官的时候还是多少会有点小紧张,有几个问题回答的也是很笼统,现在做出总结.如下: 自我面试轻轻飘过~ 这个是常识 个人信息稍作了解,常识+1 浅谈MVC框架设计模式 浅谈单例设计模式 KVC/KVO Switch开关点击出错(on状态点击依旧on状态,解决方法) cell单元格重用出现的错误(解决方法) 怎样实现代理传值 怎样实现ImageView的点击事件处理 HTTP

浅谈IOS的代码布局&lt;一&gt;

在我们需要开发一个ios应用的时候,我们通常会首先考虑到应用的开发框架.ios开发基于纯代码布局和xib,storyboard布局有差异,这里只讨论到纯代码布局.因为纯代码的布局在代码迁移中效率更高,重用更加方便.      一般一个ios应用会分为logic层(处理逻辑的类),UI层(处理界面的类),网络层(处理网络接口),基础层(一些第三方控件或者是自己编写的工具类),属性基类(全局性的通用属性类或者是logic层面用到的特定属性类).其中,基础层和网络层的代码是可以在每个项目中迁移使用的,