iOS KVO初探

欢迎大家关注我的公众号,我会定期分享一些我在项目中遇到问题的解决办法和一些iOS实用的技巧,现阶段主要是整理出一些基础的知识记录下来

文章也会同步更新到我的博客:
ppsheep.com

在Objc中有一种观察者模式,即是Key Value Observing(KVO)。利用KVO可以很容易实现视图组件和数据模型的分离。当数据模型的值改变时,会马上触发视图组件,更新视图组件。在Objc中要实现KVO,必须实现NSKeyValueObServing协议,所幸的是NSObject已经实现该协议,也就是说,几乎所有的Objc对象都可以使用KVO。

在OC中,KVO的使用步骤一般是:

  • 被监听者通过 addObserver:forKeyPath:options:context: 方法,添加监听
  • 监听者重写 observeValueForKeyPath:ofObject:change:context: 方法,实现监听
  • 被监听者移除监听

简单的实现一下,首先,我需要一个监听对象,所以创建一个Entity

//  Entity.h
#import 

@interface Entity : NSObject

@property (nonatomic, copy) NSString *name;

/**
 因为另外两个属性没有暴露出来 我们只能通过方法来改变
 */
- (void)changeName1:(NSString *)name1;

- (void)changeName2:(NSString *)name2;

@end复制代码
//  Entity.m
@interface Entity()

@property (nonatomic, copy) NSString *name1;

@end

@implementation Entity
{
    @private
    NSString *_name2;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        _name = @"name";
        _name1 = @"name1";
        _name2 = @"name2";
    }
    return self;
}

-(void)changeName1:(NSString *)name1{
    _name1 = name1;
}

-(void)changeName2:(NSString *)name2{
    _name2 = name2;
}

@end复制代码

这里 我们建了三个属性,name,name1,name2, 每个name属性都是不一样的定义,这也是我们日常coding中,最常见的三种属性定义方式。

待会我们试着对这三个属性都进行监听,看一下效果如何?

被监听者,已经创建完成了,我们现在需要一个监听者

self.model  = [[Entity alloc] init];

    UIButton *btn1 = [[UIButton alloc] initWithFrame:CGRectMake(100, 100,200, 30)];
    btn1.tag = 100001;
    [btn1 addTarget:self action:@selector(changeName:) forControlEvents:UIControlEventTouchUpInside];
    [btn1 setTitle:@"改变name" forState:UIControlStateNormal];
    [self.model addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

    UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(100, 200,200, 30)];
    btn2.tag = 100002;
    [btn2 addTarget:self action:@selector(changeName:) forControlEvents:UIControlEventTouchUpInside];
    [btn2 setTitle:@"改变值name1" forState:UIControlStateNormal];
     [self.model addObserver:self forKeyPath:@"name1" options:NSKeyValueObservingOptionNew context:nil];


    UIButton *btn3 = [[UIButton alloc] initWithFrame:CGRectMake(100, 300,200, 30)];
    btn3.tag = 100003;
    [btn3 addTarget:self action:@selector(changeName:) forControlEvents:UIControlEventTouchUpInside];
    [btn3 setTitle:@"改变值name2" forState:UIControlStateNormal];
    [self.model addObserver:self forKeyPath:@"name2" options:NSKeyValueObservingOptionNew context:nil];

    [self.view addSubview:btn1];
    [self.view addSubview:btn2];
    [self.view addSubview:btn3];复制代码

三个按钮分别对应三个属性,点击每个按钮 触发不同的KVO

改变model的属性

- (void)changeName: (UIButton *)btn{
    switch (btn.tag) {
        case 100001:
            self.model.name = @"change";
            break;
        case 100002:
            [self.model changeName1:@"change"];
            break;
        case 100003:
            [self.model changeName2:@"changge"];
            break;
        default:
            break;
    }
}复制代码

当然一定不要忘记了,重写observeValueForKeyPath方法:

//KVO监听回调
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    NSLog(@"%@", keyPath);
}复制代码

打印出当前的keypath

一定不要忘记移除监听

-(void)dealloc{
    [self.model removeObserver:self forKeyPath:@"name"];
    [self.model removeObserver:self forKeyPath:@"name1"];
    [self.model removeObserver:self forKeyPath:@"name2"];
}复制代码

经过试验 我们发现 只有点击第一个按钮,即name属性对应的按钮,才会触发监听。

从这一点,我们可以发现,只有在.h中暴露出来的属性,才能被KVO监听到,.m中的属性,是不能够被监听到。

一个简单的KVO

demo放在:

github.com/yangqian111…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值