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