iOS KVO模式简解

来源:互联网 发布:空调换热器设计软件 编辑:程序博客网 时间:2024/04/26 04:46

KVO模式 - 什么是KVO?

KVO是Key-Value Observing的简称,翻译成中文就是键值观察

实现机制为,为可能改变的数据增加一个观察者,在上面的说法中这个观察者就是controller,它去观察这个数据有没有发生变化,一旦发生变化,就会得到一个信号

这里写图片描述

**实现步骤:**

第一步:设置键值对即–K–V–

第二步:为controller添加观察者,用于观察键值对变化

第三步:延迟一秒执行,改变age

第四步:延迟两秒,移除观察

第五步:延迟三秒,改变age,看看是否移除了观察

////  ViewController.m//  KVODemo////  Created by 冯士魁 on 2017/2/19.//  Copyright © 2017年 xoxo_x. All rights reserved.//#import "ViewController.h"#import "People.h"@interface ViewController ()@property (nonatomic,strong)People *MJ;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    self.MJ = [[People alloc]init];    self.MJ.name = @"MJ";    self.MJ.age = 26;    //设置键值对即--K--V--    [self.MJ setValue:self.MJ.name forKey:@"name"];    [self.MJ setValue:[NSString stringWithFormat:@"%d",self.MJ.age] forKey:@"age"];    //为controller添加观察者,用于观察键值对变化    [self.MJ addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];    [self.MJ addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];//延迟一秒执行,改变age;[self performSelector:@selector(changeMJAge) withObject:nil afterDelay:1];//延迟两秒,移除观察    [self performSelector:@selector(removeAgeObserver) withObject:nil afterDelay:2];//延迟三秒,改变age,看看是否移除了观察    [self performSelector:@selector(changeMJAge) withObject:nil afterDelay:3];}- (void)changeMJAge{    NSLog(@"%d",self.MJ.age);     self.MJ.age += 1;}//当受到观察的键值对改变时--进行下面- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    if ([keyPath  isEqual: @"age"]) {        NSLog(@"我的年龄发生了变化");    } else {        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];    }}@end

日志如下:

2017-02-19 21:55:19.648 KVODemo[35964:872611] 262017-02-19 21:55:19.649 KVODemo[35964:872611] 我的年龄发生了变化2017-02-19 21:55:20.714 KVODemo[35964:872611] removeAgeObserver2017-02-19 21:55:21.698 KVODemo[35964:872611] 27

Demo地址:https://git.coding.net/Xoxo_x/KVODemo.git

0 0