Objective-C KVO 编程 改善现有iOS代码设计

原创 2012年09月09日 22:42:24
KVC很多人都知道,那么什么是KVO呢?Key Value Observing,直译为:基于键值的观察者。
KVO的优点
当有属性改变,KVO会提供自动的消息通知。这样的架构有很多好处。首先,开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。
这 是KVO机制提供的最大的优点。因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。开发人员不需要添加任何代码,不需要设计自己的观察者模 型,直接可以在工程里使用。其次,KVO的架构非常的强大,可以很容易的支持多个观察者观察同一个属性,以及相关的值。

主要用于有关视图界面交互编程中,比如,实体(或者叫名词、或者叫域模型),在应用中表示名词的部分,类似Java中的Java Bean。再具体点儿,在下文的示例中。
图书(Book类),就是个实体。它的属性有书名(name)和价格(price)。那么,在界面开发中,可能有多个视图和这个实体有关联。
如果等实体(Book)的价格(price)发生了变化,这些关联的界面都要被修改。

比较好的做法是使用观察者模式,各个界面都注册观察者,观察图书的价格变化,当变化后改动自己的视图。

ObjC中提供了这个模式的解决方案,就是KVO。以下用简单示例说明KVO的实现方式。

Book类,头文件:

#import <Foundation/Foundation.h>

@interface Book : NSObject { 
    NSString *name; 
    float price; 
}

@end

 

Book类的实现文件,没做任何事情,不贴了。

现在,假设我有个视图,MyView,我这里为了不带入实际视图类的复杂性,只是模拟一个。用普通类。头文件:

#import <Cocoa/Cocoa.h>

@class Book;

@interface MyView : NSObject { 
    Book *book; 
}

- (id) init:(Book *)theBook;

@end

 

实现文件:

#import "MyView.h"

@implementation MyView

- (id) init:(Book *)theBook { 
    if(self=[super init]){ 
        book=theBook; 
        [book addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil]; 
    } 
    return self; 
}

- (void) dealloc{ 
    [book removeObserver:self forKeyPath:@"price"]; 
    [super dealloc]; 
}

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context{ 
    if([keyPath isEqual:@"price"]){ 
        NSLog(@">>>>>>>price is changed"); 
        NSLog(@"old price is %@",[change objectForKey:@"old"]); 
        NSLog(@"new price is %@",[change objectForKey:@"new"]);
    } 
}

@end

 

这里的init方法中,可以看到向book实例增加了观察者,是针对价格price属性的。这里用的:

options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew

可以让通知携带旧的price值和新的price值。后面会看到。observeValueForKeyPath方法,就是当price属性发生变化后,调用的方法。

main方法中调用的代码:

Book *book4=[[Book alloc] init]; 
NSArray *bookProperties=[NSArray arrayWithObjects:@"name",@"price",nil]; 
NSDictionary *bookPropertiesDictionary=[book4 dictionaryWithValuesForKeys:bookProperties]; 
NSLog(@"book values: %@",bookPropertiesDictionary);

[[[MyView alloc] init:book4] autorelease];

NSDictionary *newBookPropertiesDictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"《Objective C入门》",@"name", 
                                           @"20.5",@"price",nil]; 
[book4 setValuesForKeysWithDictionary:newBookPropertiesDictionary]; 
NSLog(@"book with new values: %@",[book4 dictionaryWithValuesForKeys:bookProperties]);

 

在这里引发了price属性变化,触发了MyView的处理。

另外,要注意,在Book实例释放前,要删除观察者,否则会报错,这里是在MyView里面实现的:

- (void) dealloc{ 
    [book removeObserver:self forKeyPath:@"price"]; 
    [super dealloc]; 
}

 

这里假定MyView实例的生命周期小于等于Book实例。实际使用可能要根据情况在合适的地方addObserver和removeObserver。



                    

《重构-改善代码既有的设计》重构,第一个案例

起点:编写3个类的代码 1、第一个类-影片(Movie):package com.lee.test.aFirstExample;public class Movie { /** * ...
  • limuzi13
  • limuzi13
  • 2016年11月16日 17:15
  • 477

iOS--KVO的实现原理与具体应用

iOS--KVO的实现原理与具体应用 本文分为2个部分:概念与应用。 概念部分旨在剖析KVO这一设计模式的实现原理,应用部分通过创建的项目,以说明KVO技术在iOS开发中所带来的作用; 如果...
  • volitory
  • volitory
  • 2017年02月25日 13:12
  • 312

《编写高质量代码:改善Objective-C程序的61个建议》

pdf下载地址: http://download.csdn.net/detail/u013059266/9470077只可惜 网络版本的pdf 只有16个建议,因为前面的是试读,后面的要收费。下次区...
  • u013059266
  • u013059266
  • 2016年03月24日 20:03
  • 553

《重构 改善既有代码的设计》——学习笔记(一)

代码的坏味道Duplicated Code(重复代码) 同一个类的两个函数含有相同的表达式,需要将重复的这段代码提出来,让这两个函数都调用这段代码 两个互为兄弟的子类内含相同表达式,需要将代码提炼出来...
  • benhuo931115
  • benhuo931115
  • 2017年04月17日 19:04
  • 460

iOS学习——KVO底层实现机制探究

一、什么是KVO? KVO(Key Value Observing, 键值观察)是Objective-C对观察者模式的实现,每次当被观察对象的某个属性值发生改变时,注册的观察者便能获得通知。 使用KV...
  • chy305chy
  • chy305chy
  • 2016年07月06日 22:22
  • 1596

重构 改善既有代码的设计——重构原则

1.何谓重构? 答: A.重构(名词意义):对软件内部结构的调整,目的是在不改变软件可观察行为的前提下,提高其理解性,降低其修改成本; B.重构(动词意义):使用一系列重构手法,在不改变软件可观...
  • zhongshujunqia
  • zhongshujunqia
  • 2016年09月08日 11:52
  • 1129

《重构-改善既有代码的设计》pdf

下载地址:网盘下载 编辑推荐 编辑 软件工程领域的超级经典巨著,与另一巨著《设计模式》并称"软工双雄",全美销量超过100000册,亚马逊书店五星书。 ...
  • cf406061841
  • cf406061841
  • 2017年05月15日 00:17
  • 3585

《重构:改善代码的既有设计》读书笔记

本文已同步发表在博客园:http://www.cnblogs.com/davidsheh/p/5239745.html 第1章 重构,第一个案例 代码块俞小,代码的功能就俞容易管理,代码的处理和移动也...
  • wenxin2011
  • wenxin2011
  • 2016年03月03日 19:14
  • 2240

《重构-改善既有代码的设计》读书笔记

重构,第一个案例 1.1 起点 如果发现现有的代码结构使你无法很方便地添加新特性,那就先重构,使特性的添加比较容易进行后,再添加特性; 1.2 重构的第一步 为即将修改的代码建...
  • jinnblue
  • jinnblue
  • 2017年04月12日 11:33
  • 357

《重构:改善既有代码的设计》读书笔记

如果一个人没有听说过《重构》这本书,那么他一定不敢说自己是程序员;如果一个人没有阅读过《重构》这本书,那么很难想象他会是一名优秀的程序员。这本书是很多公司要求Java程序员必读的三本书之一(另外两本书...
  • jackfrued
  • jackfrued
  • 2015年04月10日 15:54
  • 9905
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C KVO 编程 改善现有iOS代码设计
举报原因:
原因补充:

(最多只允许输入30个字)