`
lizhuang
  • 浏览: 906250 次
  • 性别: 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 设计模式 观察者模式

    3. **协议与代理**:这是iOS开发中最常用的自定义观察者模式实现方式。定义一个协议,包含一个或多个方法来处理事件或状态改变,然后被观察者类遵循这个协议,观察者通过设置代理来接收被观察者的事件。这种方式灵活...

    KVO观察者模式

    以上就是关于KVO观察者模式的详细介绍,它在iOS开发中提供了简单且强大的数据绑定功能,能够帮助开发者轻松实现属性变化的监听和响应。如果在实际使用过程中遇到问题,可以通过各种途径寻求帮助,比如查阅官方文档、...

    iOS KVO 监听frame

    KVO是Objective-C中一种基于runtime机制的观察者模式实现,它允许一个对象(观察者)订阅另一个对象(被观察者),当被观察者的某个属性发生变化时,观察者会收到通知。KVO的核心是`NSKeyValueObserving`协议,对象...

    ios KVO实现原理

    1. **内存管理**:KVO会在观察者和被观察者之间创建强引用,可能导致循环引用。确保正确移除观察者至关重要。 2. **非KVC-compliant属性**:如果属性不是KVC-compliant(例如,私有变量),KVO可能无法正常工作。 ...

    iOSkvo的一个例子

    2. **实现观察者方法**:为了接收KVO的通知,你需要在观察者对象中实现`observeValueForKeyPath:ofObject:change:context:`方法。在这个方法里,你可以根据`change`字典获取旧值和新值。 ```objc - (void)...

    iOS KVO设计模式

    KVO是Apple为Objective-C设计的一种观察者模式实现,使得开发者能够方便地跟踪和响应对象属性值的改变。KVO与Key-Value Coding(KVC)一起工作,KVC是一种机制,允许程序通过键来间接访问对象的属性,而无需了解对象...

    ios-KVO底层实现--利用runtime简单的实现KVO底层原理.zip

    当一个对象被添加到观察者列表后,系统会动态地生成一个新的类,这个类继承自原始类,并重写了被观察属性的setter方法,以实现通知观察者的目的。 3. **KVO注册与注销** 使用`addObserver:forKeyPath:options:...

    ios kvo使用

    自iOS 6起,苹果引入了自动合成KVO,无需手动实现`NSKeyValueCoding`协议方法。对于`@dynamic`属性,只需要在类中声明`+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key;`并返回`YES`即可。 ### 6. ...

    IOS KVO Demo

    3. **实现观察者回调**:观察者需要实现`observeValueForKeyPath:ofObject:change:context:`方法。这个方法会在属性变化时被调用,其中`change`字典包含了关于改变的信息,如旧值、新值以及改变类型。 4. **解除...

    IOS观察者模式

    在iOS开发中,Objective-C提供了Key-Value Observing(KVO)这一机制来实现观察者模式。KVO是苹果内置于Foundation框架中的,允许我们监听某个对象的属性变化,从而做出相应的响应。 **一、Key-Value Observing ...

    ios-MVC KVO实现.zip

    本项目"ios-MVC KVO实现.zip"似乎是一个关于如何在iOS应用中结合MVC模式和KVO技术的示例。下面将详细讲解MVC模式和KVO的原理以及它们在实际开发中的应用。 **MVC模式详解** MVC模式由模型(Model)、视图(View)...

    ios kvo和Notification的使用demo

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

    kvo的ios代码

    - **避免循环引用**:KVO可能导致意外的强引用,因此在观察者和被观察者之间建立关系时,要小心处理内存管理,避免循环引用。 - **多线程**:KVO不是线程安全的,因此在多线程环境下使用KVO需要额外的同步措施。 #...

    ios kvo详解

    1. **避免在循环引用中使用KVO**:如果观察者和被观察者之间存在强引用,可能导致内存泄漏。确保正确管理对象的生命周期。 2. **处理未定义属性**:试图监听未定义的属性会导致运行时错误。在使用KVO前,确保属性...

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

    通过这种方式,开发者可以在不关心何时移除观察者的情况下,放心地添加KVO观察者。当目标或观察者对象被释放时,系统会自动调用`removeObserver:forKeyPath:`,避免内存泄漏和未预期的回调,提高了代码的健壮性。...

    ios kvo 实战解析

    2. **实现观察者回调**:在观察者类中,需要实现`observeValueForKeyPath:ofObject:change:context:`方法。这个方法会在属性变化时被调用。 ```objc - (void)observeValueForKeyPath:(NSString *)keyPath ofObject...

    iOS之KVO实例代码

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

    iOS-KVO模式源码Demo

    在“KVODemo”项目中,开发者可能会创建一个简单的模型对象,通过KVO观察其属性变化,然后在UI上实时反映这些变化。 ### 6. KVO与其他通知机制比较 KVO与`NSNotificationCenter`、代理模式相比,有其独特优势:KVO...

    KVO实现原理demo

    KVO是Apple在Foundation框架中提供的一个API,它为Objective-C的面向对象编程增加了观察者模式的支持。在iOS和Mac OS X开发中,KVO常用于视图和模型之间的数据同步,以及在不侵入被观察对象的情况下实现属性变化的...

Global site tag (gtag.js) - Google Analytics