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

2016-10-04  本文已影响101人  走停2015_iOS开发

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

#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];
}
上一篇 下一篇

猜你喜欢

热点阅读