响应式编程思想__重写KVO方法

响应式编程思想 KVO本质是监听一个对象有没有调用set方法
重写这个方法
KVO底层实现

  • 自定义观察类的子类(NSKVONOtifying_**),
  • 重写set方法,在内部回复父类的做法,通知观察者
  • 如何让外界调用类的子类方法,修改当前类的isa指针,指向类的子类
#import "Person+objc.h"
#import <objc/message.h>
#import "SonPerson.h"
NSString *const observerkey = @"observer";
-(void)QW_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
{
    //  1.  自定义观察类的子类(NSKVONOtifying_**),
    //  2.  重写set方法,在内部回复父类的做法,通知观察者
    //  3.  如何让外界调用类的子类方法,修改当前类的isa指针,指向类的子类
    // 把观察者保存到当前对象中
    objc_setAssociatedObject(self, (__bridge const void *)(observerkey), observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    //    修改isa指针
    object_setClass(self, [SonPerson class]);
}
#import "SonPerson.h"
#import <objc/message.h>
extern NSString *const observerkey;
@implementation SonPerson
-(void)setName:(NSString *)name
{
    [super setName:name];
// 通知观察者调用observeValueForKeyPath
// 把观察者保存到当前对象中
// 获取观察者
 id obser =  objc_getAssociatedObject(self, observerkey);
    [obser observeValueForKeyPath:@"name" ofObject:self change:nil context:nil];
}
#import "ViewController..m"
 - (void)viewDidLoad {
    [super viewDidLoad];
-  响应式编程思想 KVO本质是监听一个对象有没有调用set方法
//  重写这个方法
//  KVO底层实现
//  1.  自定义观察类的子类(NSKVONOtifying_**),
//  2.  重写set方法,在内部回复父类的做法,通知观察者
//  3.  如何让外界调用类的子类方法,修改当前类的isa指针,指向类的子类
    Person *p = [[Person alloc]init];
    [p QW_addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
    self.person = p}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    NSLog(@"%@",_person.name);
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    static int i  = 0;
    i++;
    self.person.name = [NSString stringWithFormat:@"%d",i];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容