IOS学习笔记八(KVO)

简介: IOS学习笔记八(KVO)

1、KVO介绍

KVO机制NSKeyValueObserving协议支持,NS遵循了这个协议 ,所以NSObject的子类都可使用协议中的方法,下面方法可以注册监听


添加监听器


addObserver: forKeyPath: options: context:


删除监听


removeObserver: forKeyPath:


//重写下面的方法,当数据发生变化的时候会回调这个函数


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context


2、测试代码

FKItemView.h

#ifndef FKItemView_h

#define FKItemView_h

#import <Foundation/Foundation.h>

#import "FKItem.h"

@interface FKItemView : NSObject

@property (nonatomic, weak) FKItem *item;

-(void)showItemInfo;

@end

#endif /* FKItemView_h */


FKItemView.m

#import <Foundation/Foundation.h>

#import "FKItemView.h"

@implementation FKItemView

@synthesize item = _item;

-(void)showItemInfo

{

   NSLog(@"item物品名为:%@,物品价格为:%d", self.item.name, self.item.price);

}

//自定义设置item

-(void)setItem:(FKItem *)item

{

   self->_item = item;

//    self.item = item;

   //为item添加监听器,监听item的name属性的改变

   [self.item addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

   [self.item addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionInitial context:nil];

 

}

//重写方法,当监听的数据模型发生改变时候,就会回调这个方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

{

   NSLog(@"observeValueForKeyPath方法被调用了");

   NSLog(@"被修改的keyPath为:%@", keyPath);

   NSLog(@"被修改的对象为:%@", object);

   NSLog(@"新被修改的属性值为:%@", [change objectForKey:@"new"]);

   NSLog(@"被修改的上下文为:%@", context);

}

-(void)dealloc

{

   [self.item removeObserver:self forKeyPath:@"name"];

   [self.item removeObserver:self forKeyPath:@"price"];

}

@end


main.m

#import "FKItemView.h"

int main(int argc, char * argv[]) {

   @autoreleasepool {

       FKItemView *itemView = [FKItemView new];

       FKItem *item = [FKItem new];

       itemView.item = item;

       [itemView showItemInfo];

       item.name = @"chencaifeng";

       item.price = 79;

     

   }

}

3、运行结果

observeValueForKeyPath方法被调用了

被修改的keyPath为:name

被修改的对象为:<FKItem: 0x600000035360>

新被修改的属性值为:chencaifeng

被修改的上下文为:(null)

observeValueForKeyPath方法被调用了

被修改的keyPath为:price

被修改的对象为:<FKItem: 0x600000035360>

新被修改的属性值为:(null)

被修改的上下文为:(null)

 

相关文章
|
自然语言处理 开发工具 Swift
移动用户反馈-iOS接入指南 | 学习笔记
快速学习移动用户反馈-iOS接入指南
222 0
移动用户反馈-iOS接入指南 | 学习笔记
|
小程序 前端开发 Shell
接入 mPaaS 小程序并实现启动 iOS 版| 学习笔记
快速学习接入 mPaaS 小程序并实现启动 iOS 版。
562 0
接入 mPaaS 小程序并实现启动 iOS 版| 学习笔记
|
移动开发 小程序 前端开发
iOS 端自定义开发(二)| 学习笔记
快速学习 iOS 端自定义开发。
171 0
iOS 端自定义开发(二)| 学习笔记
|
移动开发 JSON 小程序
iOS 端自定义开发(一)| 学习笔记
快速学习 iOS 端自定义开发。
222 0
iOS 端自定义开发(一)| 学习笔记
|
小程序 IDE API
iOS 端预览和调试小程序| 学习笔记
快速学习 iOS 端预览和调试小程序。
206 0
iOS 端预览和调试小程序| 学习笔记
|
小程序 Shell 开发工具
接入 mpaas 小程序并实现启动 IOS 版|学习笔记
快速学习接入 mpaas 小程序并实现启动 IOS 版
189 0
接入 mpaas 小程序并实现启动 IOS 版|学习笔记
|
移动开发 人工智能 小程序
iOS 端自定义开发(二)|学习笔记
快速学习iOS 端自定义开发(二)
178 0
|
移动开发 JSON 小程序
iOS 端自定义开发(一)|学习笔记
快速学习iOS 端自定义开发(一)
139 0
iOS 端自定义开发(一)|学习笔记
|
小程序 IDE API
IOS 端预览和调试小程序|学习笔记
快速学习 IOS 端预览和调试小程序
120 0
IOS 端预览和调试小程序|学习笔记
|
API 开发工具 iOS开发
iOS 接入指南|学习笔记
快速学习 iOS 接入指南|
193 0
iOS 接入指南|学习笔记