iOS 键值观察(KVO)简述及实例理解

KVO概述:
KVO,即:Key-Value Observing,直译为:基于键值的观察者。  它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。
简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。KVO的优点:
当有属性改变,KVO会提供自动的消息通知。这样开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。
这是KVO机制提供的最大的优点。因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。
开发人员不需要添加任何代码,不需要设计自己的观察者模型,直接可以在工程里使用。
其次,KVO的架构非常的强大,可以很容易的支持多个观察者观察同 一个属性,以及相关的值。使用步骤如下:
1. 注册,指定被观察者的属性
 -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context 
keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型)
2. 实现回调方法
 -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。
是自动调用的,只要你所监听对象的属性或者实例变量发生变化,就自动调用该函数,执行相应操作
3. 触发回调方法
实例理解代码
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
{
    NSString *kkk;
    NSMutableDictionary *xxx;

}
- (IBAction)btntest:(id)sender {
    [self setValue:@"222" forKey:@"kkk"];
    NSMutableDictionary *ccc = [[NSMutableDictionary alloc] init];
    [ccc setObject:@"v" forKey:@"k"];
    [self setValue:ccc forKey:@"xxx"];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    xxx = [[NSMutableDictionary alloc] init];
    [self setValue:@"111" forKey:@"kkk"];
    [self addObserver:self forKeyPath:@"kkk" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
    NSMutableDictionary *zzz = [[NSMutableDictionary alloc] init];
    [self setValue:zzz forKey:@"xxx"];
    [self addObserver:self forKeyPath:@"xxx" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualToString:@"kkk"])
    {
        NSString *old = [change valueForKey:@"old"];
        NSString *new = [change valueForKey:@"new"];
        NSLog(@"old=%@,new=%@", old, new);
    }
    if([keyPath isEqualToString:@"xxx"])
    {
        NSMutableDictionary *old = [change valueForKey:@"old"];
        NSMutableDictionary *new = [change valueForKey:@"new"];
        NSLog(@"old=%ld,new=%ld,xxx=%ld", [old count], [new count], [xxx count]);
    }
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
时间: 2024-08-06 07:19:55

iOS 键值观察(KVO)简述及实例理解的相关文章

obj-c编程17:键值观察(KVO)

说完了前面一篇KVC,不能不说说它的应用KVO(Key-Value Observing)喽.KVO类似于ruby里的hook功能,就是当一个对象属性发生变化时,观察者可以跟踪变化,进而观察或是修正这个变化,这是通过回调观察者注册的回调函数来完成的.要使用键值观察,必须满足3个条件: 1 被观察对象必须对所观察属性使用符合KVC标准的存取器方法: 2 观察者必须实现接受通知的方法(回调方法):-observeValue:forKeyPath:ofObject:change:context:,该方法

Rx 键值观察KVO的使用

键值观察KVO的使用 1,KVO 介绍 KVO(键值观察)是一种 Objective-C 的回调机制,全称为:key-value-observing. 该机制简单来说就是在某个对象注册监听者后,当被监听的对象发生改变时,对象会发送一个通知给监听者,以便监听者执行回调操作. 2,RxSwift 中的 KVO RxCocoa 提供了 2 个可观察序列 rx.observe 和 rx.observeWeakly,它们都是对 KVO 机制的封装,二者的区别如下. (1)性能比较 rx.observe 更

键值观察 KVO

Key-Value Observing Programming Guide 1,注册Key-Value Observing: 要实现这个目的,需要: 1)被观察的类对你想要观察的属性必须是服从Key-Value observing的 2)你必须注册被观察对象的观察对象,使用addObserver:forKeyPath:options:context:. 3)观察者类必须实现observeValueForKeyPath:ofObject:change:context: 重要提示:不是所有的类对所有

KVO键值观察简述

KVO 键值观察,简单来说就是为一个key添加一个观察者,当key的值发生改变的时候会发送通知,在接到通知的时候会有回调方法被调用 #import "ViewController.h" @interface ViewController (){     NSMutableDictionary * myDict; } @end @implementation ViewController - (IBAction)dasdas:(id)sender {          //改变key的值

[深入浅出Cocoa]详解键值观察(KVO)及其实现机理

一,前言 Objective-C 中的键(key)-值(value)观察(KVO)并不是什么新鲜事物,它来源于设计模式中的观察者模式,其基本思想就是: 一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象.这个主动通知通常是通过调用各观察者对象所提供的接口方法来实现的.观察者模式较完美地将目标对象与观察者对象解耦. 在 Objective-C 中有两种使用键值观察的方式:手动或自动,此外还支持注册依赖键(即一个键依赖于其他键,其他键的变化也会作用到该键).下面将一一

KVO(键-值观察)

// 1.键-值观察 // 2.它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知. // 3.符合KVC(Key-ValuedCoding)机制的对象才可以使用KVO // 4.实现过程 // ①注册,指定被观察者 // ②实现回调方法 // ③移除观察 - (void)viewDidLoad {     [super viewDidLoad];     // Do any additional setup after loading the view from its nib.

K-V-C 键值观察机制

在两个不同的控制器之间传值是iOS开发中常有的情况,应对这种情况呢,有多种的应对办法.kvc就是其中的一种,所以,我们就在此解释之.   key value observing  键值观察,给人一种高冷的感觉,其实,我们可以用一个通俗的例子来解释之.就拿美俄之间的间谍来举例子.美俄是两个各自独立的国家,但是为了各自的利益,彼此之间勾心斗角,不断的爆出间谍丑闻.打住!从政治的深渊回到技术层面O(∩_∩)O.美国想知道俄罗斯的最新的导弹技术,于是派间谍收集情报,(kvo的第一步:注册观察者-美国,监

深度理解Key-Value Observing 键值观察

前言   在上一阶段的开发过程中,我们大量使用了 KVO 机制,来确保页面信息的及时同步.也因此碰到了很多问题,促使我们去进一步学习 KVO 的相关机制,再到寻找更好的解决方案.鉴于 KVO 让人欲仙欲死的使用经历,在这里做一个简单分享.此分享的目的,更多的是在于点出 KVO 相关的技术点,供我们大家在学习和使用过程中做一个参考. 对于 KVO 的背后机制感兴趣的同学,可以直接看第三部分,KVC 和 isa-swizzling . 对于 替代方案感兴趣的同学,请直接跳到末尾的第五部分,有列出了目

键-值观察

若想成为一个键的观察者,可添加如下代码. [theAppDelegate addObserver:self forKeyPath:@"fido" options:NSKeyValueObservingOptionOld context:nil]; 上述方法定义在NSObject中,实际上类似于说,“无论何时fido改变了就给我发个消息”,options和context决定fido改变时将哪些额外的数据与消息一起发送出去.触发方法过程如下 -(void)observeValueForKe