美文网首页
响应式编程思想__重写KVO方法

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

作者: 走停2015_iOS开发 | 来源:发表于2016-10-04 00:42 被阅读101次

    响应式编程思想 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];
    }
    

    相关文章

      网友评论

          本文标题:响应式编程思想__重写KVO方法

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