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。



                

iOS应用安全之代码混淆设计篇

iOS应用安全随着各种事件的曝出,越来越受到重视。那针对iOS应用安全方面能做点什么呢?如何让我们开发的应用更安全一点呢?要知道如何才能安全,就要了解iOS应用怎么就不安全了呢?现在随着越狱技术的提高...
  • zm53373581
  • zm53373581
  • 2015-10-11 21:35:19
  • 6059

设计模式与代码重构——ios篇

有一阵子没写技术分享文了,最近每个月写一篇个人空间日记。主要是觉得自己技术比较一般写不出有质量的东西,误人子弟。互联网信息膨胀,让我们获取信息更加便捷,然而获取个人所需的正确信息,却需要每个人具备更强...
  • zhuxincheng_1218
  • zhuxincheng_1218
  • 2016-05-22 20:56:59
  • 4204

IOS 自己设计的一个APP,附源码

(本文所有的gif图中的UI设计,APP架构均为独立设计) 最近自己构思了一个关于宠物的APP, 一方面可以锻炼下自己的创造能力与细节的思考能力,另一方面可以将已经学过的知识重新复习梳理一遍...
  • hbw1992322
  • hbw1992322
  • 2016-05-24 21:20:16
  • 1094

如何设计一个 iOS 控件?(iOS 控件完全解析)

> 代码的等级:可编译、可运行、可测试、可读、可维护、可复用 --- # 前言 一个控件从外在特征来说,主要是封装这几点: > * 交互方式 * 显示样式 * 数据使用 对外在特征的封装,能让我...
  • zhangao0086
  • zhangao0086
  • 2015-05-25 11:35:22
  • 33626

iOS代码库汇总 & 交互设计资源汇总(持续更新。。。)

iOS 示例代码库 / sample code By xatest · 2012-07-17 23:23:18 PM · 3074 次点击 这是一个创建于 426 天前的主题,其中的信息可能已经有所发...
  • tskyming
  • tskyming
  • 2013-09-17 22:34:52
  • 1570

ios 各种项目源码

http://www.cocoachina.com/ios/20160719/17078.html 一:源代码实例 1:快速搭建项目源代码 地址:https://gi...
  • robinson_911
  • robinson_911
  • 2016-07-19 15:44:46
  • 8312

<em>IOS</em> 工厂方法模式<em>代码</em>Demo

<em>IOS</em> 工厂方法模式<em>代码</em>Demo <em>IOS</em> 工厂 方法 模式 <em>设计</em> 综合评分:4 收藏评论(5)举报 所需: 3积分/C币 下载个数: 312 开通VIP 立即下载 ...
  • 2018年04月11日 00:00

代码重构[iOS开发]

1.项目结构设计思想; 2.项目重构
  • kaka_2928
  • kaka_2928
  • 2016-04-26 17:31:59
  • 1070

IOS App常用界面结构解析,让开发更简单

在市面上,我们所使用的大部分工具应用类型的app都是有一定的界面结构的(类似淘宝,QQ, 微信),其中最主要的界面结构归纳起来就是使用 “导航栏(navigationBar) + 主视图(mainVi...
  • shenjie12345678
  • shenjie12345678
  • 2016-04-26 23:08:57
  • 11152
收藏助手
不良信息举报
您举报文章:Objective-C KVO 编程 改善现有iOS代码设计
举报原因:
原因补充:

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