美文网首页
自定义KVO监听方式

自定义KVO监听方式

作者: i玉米炖排骨 | 来源:发表于2018-04-11 11:26 被阅读0次

kvo 观察者的本质是,是否有调用set方法

自定义KVO

实现观察People类的name属性

People.h

@interface People : NSObject

@property (nonatomic,copy)NSString *name;

@end

1.实现NSObject分类(类别)

.h文件中

#import

@interface NSObject (KVO)

- (void)ym_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

@end

.m文件中

#import "NSObject+KVO.h"

#import

#import "NSKVONotifying_People.h"

NSString *const observerKey = @"observer";

@implementation NSObject (KVO)

-(void)ym_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context

{

    // 1.自定义NSKVONotifying_Person子类

    // 2.重写setName,在内部恢复父类做法,通知观察者

    // 3.如何让外界调用自定义Person类的子类方法,修改当前对象的isa指针,指向NSKVONotifying_Person

    objc_setAssociatedObject(self, (__bridge const void *)(observerKey), observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

//修改isa指针

    object_setClass(self, [NSKVONotifying_People class]);

}

@end

2.创建NSKVONotifying_People 继承people类

.h文件中

#import "People.h"

@interface NSKVONotifying_People : People

@end

.m文件中

#import "NSKVONotifying_People.h"

#import

extern NSString *const observerKey;

@implementation NSKVONotifying_People

- (void)setName:(NSString *)name

{

    //恢复父类的set方法

    [super setName:name];

    // 通知观察者调用observeValueForKeyPath

    // 需要把观察者保存到当前对象

    // 获取观察者

  id observer = objc_getAssociatedObject(self, (__bridge const void *)(observerKey));

    [observer observeValueForKeyPath:@"name" ofObject:self change:nil context:nil];

}

@end

如何使用:

    People *p = [[People alloc] init];

    //调用自定义KVO

    [p ym_addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

实现下面方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    NSLog(@"%@",_p.name);

}

到此结束

相关文章

  • 自定义KVO,自动释放,监听多个属性

    自定义的 KVO,支持多属性监听,支持自动释放。 使用系统 KVO 监听属性 先来回顾下系统 KVO 是如何使用的...

  • 自定义KVO监听方式

    kvo 观察者的本质是,是否有调用set方法 自定义KVO 实现观察People类的name属性 People.h...

  • KVO 本质 & 自定义实现

    KVO 本质 & 自定义实现 KVO 是什么? Key-Value Observer 即键值观察者。作用为监听某个...

  • iOS-runtime自定义KVO----分类添加关键属性

    1. KVO原理 2. runtime自定义KVO 3. runtime给分类添加关联属性 我们注册监听的时候,会...

  • KVO

    KVO (Key-value-observing) 键值监听 iOS用什么方式实现对一个对象的KVO?(KVO的本...

  • OC底层原理学习笔记(二)- KVO、KVC的本质

    一、KVO 1、KVO实现属性监听的原理KVO俗称“键值监听”,可以用于监听某个对象属性值的改变未使用KVO监听的...

  • KVO学习

    KVO,俗称键值监听,可以用于监听某个对象属性值的改变。 先简单的演示下KVO的使用方式 点击手机屏幕,打击结果如...

  • KVO

    iOS用什么方式实现对一个对象的KVO?(KVO的本质) 1 未使用KVO监听的对象 MJPerson insta...

  • UITableView 下拉刷新的实现

    UITableView下拉刷新的实现原理是自定义的下拉刷新控件KVO监听UITableView(UIScrollV...

  • 面试题整理

    KVO原理及自定义KVO KVO原理我们注册监听的时候,会对注册者动态的创建一个子类对象,然后底层找方法的的isa...

网友评论

      本文标题:自定义KVO监听方式

      本文链接:https://www.haomeiwen.com/subject/cweahftx.html