kvo深入浅出举例

一,概述

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

二,使用方法

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1. 注册,指定被观察者的属性   

2. 实现回调方法 谁是观察者 这个回调方法就写在哪

3. 移除观察  最好在dealloc中写

三,实例:

假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。

添加两个实体类 一个是股票Strock 一个是person

Strock.h
@interface Strock : NSObject
 {
     NSString *_name;
     float _price;
 }
@end
Strock.m
-(NSString *)description
 {
     return [NSString stringWithFormat:@"name:%@,price:%f",_name,_price];
}
person.m
//回调方法
 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
 {
     NSLog(@"keyPath:%@,object:%@,change:%@",keyPath,object,change);
}
viewController.m
   self.person = [[Person alloc]init];
     self.strock = [[Strock alloc]init];
 
     //给属性赋值
     [self.strock setValue:@"baidu" forKey:@"_name"];
     [self.strock setValue:@155 forKey:@"_price"];
 
     //设置person为观察者
     [self.strock addObserver:self.person forKeyPath:@"_price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
 
 }
//拖进来一个点击 事件  当button点击的时候
 - (IBAction)priceClicked:(UIButton *)sender {
     NSInteger price = [[self.strock valueForKey:@"_price"]floatValue];
 
     [self.strock setValue:@(price+1) forKey:@"_price"];
 }
//移除观察者
 -(void)dealloc
 {
     [self.strock removeObserver:self.person forKeyPath:@"_price" context:nil];
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ios 技术积累

iOS SDWebimage 源码阅读

简介 SDWebimage是 iOS 的图片加载框架。它支持从网络中下载且缓存图片,并设置图片到对应的 UIImageView 控件或者 UIButton 控...

20010
来自专栏一“技”之长

配合LLDB调试器进行iOS代码调试 原

        在一款完整iOS移动应用的开发中,代码的调试和编写占着同等重要的地位。Xcode默认使用LLDB作为代码调试器,LLDB功能丰富且强大,恰当的使...

20430
来自专栏ShaoYL

iOS----轻松掌握AFN网络顶级框架

31570
来自专栏清墨_iOS分享

iOS多个网络请求完成后执行下一步

在开发中,我们很容易遇到这样的需求,需要我们同时做多个网络请求,所有网络请求都完成后才能进行下一步的操作。如下载多个图片,下载完了才能展示。 今天我们就来研究一...

56970
来自专栏Alice

iOS iOS与html进行交互

实现的 效果就是上边那样:首先通过webview 进行网络请求 然后进行显示。          然后点击下一页的按钮 通过js的响应显示另一个网页      ...

428100
来自专栏ios 技术积累

使用GCD如何实现这个需求:A、B、C 三个任务并发,完成后执行任务 D

需要解决这个首先就需要了解dispatch_group_enter 和 dispatch_group_leave。

42110
来自专栏ShaoYL

iOS--多线程之线程间通讯

29480
来自专栏冰霜之地

Weex 是如何在 iOS 客户端上跑起来的

2016年4月21日,阿里巴巴在Qcon大会上宣布跨平台移动开发工具Weex开放内测邀请。Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出N...

51130
来自专栏DannyHoo的专栏

解决“真机上不能读取本地路径”的问题d

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

15820
来自专栏Jacklin攻城狮

iOS开发中的这些权限,你搞懂了吗?

![Uploading 144446-b8aca7ba38c5f8c0_695906.png . . .]获取相册权限

21040

扫码关注云+社区

领取腾讯云代金券