`
lizhuang
  • 浏览: 893052 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

iOS KVO 观察者模式实现方式

阅读更多
原文:http://gaoyong.diandian.com/post/2012-08-08/40031793795

KVO (Key Value Observing)是ios里面一种特别方便的机制用于“捕捉”对象属性的变化。在概念理解上,是设计模式里面观察者模式的一种实践。

拿一个具体的例子来讲:

有一个数据对象EmployeeData,该对象有一个属性salary

有一个ViewController 用于显示对象EmployeeData的属性salary的值

当salary的值发生变化的时候,ViewController如何显示变化后的新值。

方案一:

    “可以在EmployeeData类弱引用ViewController类,然后在EmployeeData数据发生变化时,调

    用ViewController类的回调函数。这个方法虽然能达到目的,但是会破坏EmployeeData的完整

    性,一个负责数据管理的类,不应当依赖另一个负责视图控制的类;换句话说,EmployeeData

    类不应该知道关于ViewController类的任何事情,甚至不需要知道其从在”

方案二:

使用ios提供的消息中心(NSNotificationCenter)。在此EmployeeData为消息生产者,ViewController为消息消费者。当salary数据发生变化时发送一个消息既可。

ViewController接收到salary数据变化的通知做相对应的业务处理。不足之处如同方案一,EmployeeData对象的salary每次变动都需要发送“通知”。这项工作对EmployeeData自身来讲毫无意义。

方案三:

在ViewController中将自身(self)设置为EmployeeData salary属性值变化的观察者。当salary值发生变化时,执行一个回调方法。这样对“EmployeeData”来讲不用关心除自身业务以

外的事情。避免了方案一和方案二的瑕疵。对ViewController来讲关注谁的变化,注册自己为其的观察者既可。间接轻便。



下面是一些核心的代码。



//
//  EmployeeData.h
//  KVOExample
//
//  Created by gaoyong on 12-8-8.
//  Copyright (c) 2012年 gaoyong. All rights reserved.
//
                 
#import <Foundation/Foundation.h>
                 
@interface EmployeeData : NSObject {
                     
    NSString *salary;
}
                 
@property(nonatomic,retain) NSString *salary;
                 
@end

 

//
//  EmployeeData.m
//  KVOExample
//
//  Created by gaoyong on 12-8-8.
//  Copyright (c) 2012年 gaoyong. All rights reserved.
//
                
#import "EmployeeData.h"
                
@implementation EmployeeData
@synthesize salary;
                
@end

 

//
//  ViewController.h
//  KVOExample
//
//  Created by gaoyong on 12-8-8.
//  Copyright (c) 2012年 gaoyong. All rights reserved.
//
              
#import <UIKit/UIKit.h>
              
@interface ViewController : UIViewController {
                  
    UILabel *salary;
}
              
@property(nonatomic,retain) IBOutlet UILabel *salary;
              
@end

 

 

//
//  ViewController.m
//  KVOExample
//
//  Created by gaoyong on 12-8-8.
//  Copyright (c) 2012年 gaoyong. All rights reserved.
//
      
#import "ViewController.h"
#import "EmployeeData.h"
      
      
@interface ViewController () {
      
    EmployeeData *employeeData;
}
      
@end
      
@implementation ViewController
@synthesize salary;
      
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
          
    employeeData = [[EmployeeData alloc] init];
    [employeeData addObserver:self forKeyPath:@"salary" options:NSKeyValueObservingOptionNew context:nil];
}
      
-(void)viewDidAppear:(BOOL)animated {
          
    //employeeData.salary = @"20";
    //salary.text = employeeData.salary;
    employeeData.salary = @"20";
    employeeData.salary = @"200";
    employeeData.salary = @"2000";
    employeeData.salary = @"20000";
    employeeData.salary = @"200000";
}
      
- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}
      
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
      
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
          
    NSLog(@"observeValueForKeyPath is run"); // 美妙在这里:这一行会打印5次。
          
    if (object == employeeData && [keyPath isEqualToString:@"salary"]) {
              
        self.salary.text = employeeData.salary;
    }
}
      
-(void) dealloc {
      
    [employeeData removeObserver:self forKeyPath:@"salary"];
}
      
@end




分享到:
评论

相关推荐

    ios kvo和Notification的使用demo

    Notification使用的关键是利用ios的消息中心,发送消息通知,观察者接收到消息通知,执行对应的方法。NSNotificationCenter 较之于 kvo 可以实现更大的跨度的通信机制,可以为两个无引用关系的两个对象进行通信。

    kvo的ios代码

    kvo的ios代码,kvo即创建一个观察者,当观察的对象的属性发生变化时,观察者就会去执行某些相应的事件

    iOS之KVO实例代码

    利用KVO,当UIButton属性改变时,实现方法 ...(这样的机制听起来类 似Notification,但是notification是需要一个发送notification的对象,一般是 notificationCenter,来通知观察者。而kvo是直接通知到观察对象。)

    iOS自动移除KVO观察者的实现方法

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

    IOS观察者模式

    本demo主要讲的是IOS内的kvo、kvc的综合应用,许多人有时候分不清kvo/kvc之间的区别,本demo将为你详细区分

    ios kvo详解

    1、注册观察者,实施监听。 2、在回调方法中处理属性发生的变化 3、移除观察者

    IOS中KVC和KVO用法demo

    当属性`name`的值发生变化时,观察者需要实现`observeValueForKeyPath:ofObject:change:context:`方法来接收并处理通知。 KVC和KVO的结合使用,可以在iOS应用中实现灵活的数据绑定和动态数据更新,尤其在MVVM...

    KVC_KVOTest Demo代码

    KVC_KVOTest Demo代码 KVC KVO IOS 观察者 Observe

    iOS开发中的几种设计模式介绍

    本文将深入探讨几种在iOS开发中常用的设计模式:代理模式、观察者模式、MVC模式、单例模式、策略模式以及工厂模式。 1. **代理模式**: 代理模式在iOS开发中广泛应用,主要用于对象间通信。例如,UITableView的...

    SFObservers, NSNotificationCenter和KVO自动删除观察者.zip

    SFObservers, NSNotificationCenter和KVO自动删除观察者 在任何项目中,我不再使用 SFObservers,但仍然会接受请求的请求。命令行目SFObservers是在NSNotificationCenter和KVO中为观察者 Pattern 添加自动删除的类别...

    Android 从观察者模式到DataBinding

    做过 iOS 的同学应该都了解过 KVO,是观察者模式在 Objective­C 中的应用。使用 KVO,能很方便的实现对对象属 性的监听,参见探索KVC/KVO的实现原理­KVC 一 和 探索KVC/KVO的实现原理­KVO 二 虽然 iOS 提供了对...

    iOS应用开发中使用设计模式中的观察者模式的实例

    而在Cocoa框架中,Key-Value Observing(KVO)是苹果提供的一个原生的观察者实现。KVO允许一个对象监听另一个对象的某个属性值变化,当被观察的属性改变时,KVO会自动调用观察者的`observeValueForKeyPath:ofObject:...

    ios-KVC和KVO学习笔记.zip

    使用键值观察跟踪单个属性或集合(如数组)的变化非常高效,它只需要在观察者方法中添加代码,不需要修改被观察文件内的代码,这一点和委托、通知不同。但需要注意的是,键值观察(KVO)是建立在键值编码(Key Value...

    移动开发(IOS) – Objective-C-10-KVC、谓词、KVO与通知 - iOS知识库1

    当被观察对象的某个属性值改变时,KVO会自动通知观察者,从而实现数据同步。为了启用KVO,你需要在观察者中添加观察者对象,并指定要观察的属性,通常使用`addObserver:forKeyPath:options:context:`方法。当属性...

    KVO实现自定义文件复制进度效果

    在iOS开发中,有时我们需要实现自定义的文件复制功能,并且希望实时显示复制进度,这时Key-Value Observing(KVO)技术就能派上用场。KVO是Objective-C中的一种机制,允许对象监听其他对象的属性变化。下面将详细...

    iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    KVO是一种观察者模式的实现,允许对象监听其他对象某个属性的变化,并在发生变化时收到通知。使用KVO通常分为三个步骤: - 添加观察者:调用`addObserver:forKeyPath:options:context:`方法,将观察者添加到被观察...

    KVO (Key Value Observing)

    KVO (Key Value Observing)是ios里面一种特别方便的机制用于“捕捉”对象属性的变化。在概念理解上,是设计模式里面观察者模式的一种实践。

    java餐饮小程序源码-iOSObserving:iOS观察者模式

    #谈KVC、KVO(重点观察者模式)机制编程   一不小心,小明在《跟着贝尔去冒险》这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文化外,还是镜头少普通...

Global site tag (gtag.js) - Google Analytics