文档章节

【iOS编程思想】响应式编程

魔笛GNR
 魔笛GNR
发布于 2016/07/29 17:17
字数 398
阅读 21
收藏 0
iOS

响应式编程

假设有一个父类Person,它有个属性age,我们创建一个它的子类 LYKVONotifying_Person。

我们给所有类一个扩展方法:

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

实现这个方法:

实质是修改这个对象的isa指针,把当前对象指向一个新的类,然后给对象绑定观察者对象。

- (void)ly_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context{
    //修改isa指针,就是把当前对象指向一个新的类
    object_setClass(self, [LYKVONotifying_Person class]);
    
    //给对象绑定观察者对象
    objc_setAssociatedObject(self, @"observer", observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

最后重写这个子类的 setAge 方法:

每次调用setAge方法,都会调用观察者的observeValueForKeyPath方法

- (void)setAge:(int)age{
    
    [super setAge:age];
    //KVO
    //获取观察者
    id observer = objc_getAssociatedObject(self, @"observer");
    
    //调用观察者方法
    [observer observeValueForKeyPath:@"age" ofObject:observer change:nil context:nil];
}

检验:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建一个父类的对象
    Person *p = [[Person alloc] init];
    p.age = 0;
    _person = p;
    
    //调用新的注册观察者方法
    [p ly_addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];

}

响应:

//响应方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    
    NSLog(@"Person Age %d Changed",_person.age);
}

点击按钮,设置person的age属性:

- (IBAction)changeAge:(id)sender {
    //0~99随机数
    int newAge = arc4random_uniform(100);
    NSLog(@"New Age -> %d",newAge);
    //调用setAge方法
    _person.age = newAge;
}

打印结果:


可见:一旦吊用了setAge方法,就会响应。

© 著作权归作者所有

魔笛GNR
粉丝 7
博文 82
码字总数 43485
作品 0
郑州
iOS工程师
私信 提问
iDev 全平台开发者大会 2016,评论抢赠票

即日起参与评论即有机会获得免费/优惠赠票,抢到前十楼即可获免费票一张,十楼之后评论者可获优惠购票码,请参与盖楼活动后私信@Alaise ,活动11月3号截止 2016 年 11月 5-6 日,iDev 全平台...

Alaise
2016/09/27
0
0
iDev 全平台开发者大会 2016,评论抢赠票

即日起参与评论即有机会获得免费/优惠赠票,抢到前十楼即可获免费票一张,十楼之后评论者可获优惠购票码,请参与盖楼活动后私信@Alaise ,活动11月3号截止 2016 年 11月 5-6 日,iDev 全平台...

Alaise
2016/09/27
770
4
【线下活动】深圳 iOSer Meetup —— 让 iOS 更有意思

8 月27日,BearyChat 和极光,「T」社区的小伙伴,一起为大家准备了一场专注于 iOS 相关技术的小型开发者交流活动,在本次「深圳 iOSer Meetup」中,除了三位嘉宾会和大家分享一些干货之外,...

极光推送
2016/08/23
542
1
深圳 iOSer Meetup —— 让 iOS 更有意思

  8 月27日,BearyChat 和极光,「T」社区的小伙伴,一起为大家准备了一场专注于 iOS 相关技术的小型开发者交流活动,在本次「深圳 iOSer Meetup」中,除了三位嘉宾会和大家分享一些干货之...

极光推送
2016/08/17
268
0
深圳 iOSer Meetup —— 让 iOS 更有意思

  8 月27日,BearyChat 和极光,「T」社区的小伙伴,一起为大家准备了一场专注于 iOS 相关技术的小型开发者交流活动,在本次「深圳 iOSer Meetup」中,除了三位嘉宾会和大家分享一些干货之...

极光推送
2016/08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Disable Autostart of MySQL Server on Ubuntu

OSC Markdown Editer 真香,笔记一篇,懒得转中文,如有表述问题,请不吝指出,先谢为敬! OS: Ubuntu 19.04 When the MySQL server is installed, it automatically started with the OS. I...

Iridium
19分钟前
0
0
OpenStack RDO + S3

Packstack(RDO) installation "sync db timeout" issue version: openstack-packstack-13.0.0-0.1.0rc1.el7.noarchopenstack-packstack-puppet-13.0.0-0.1.0rc1.el7.noarch add timeout =>......

Firxiao
21分钟前
0
0
java运算符的优先级

https://www.cnblogs.com/zjfjava/p/5996666.html

南桥北木
26分钟前
0
0
线性代数的静态观-向量空间(一)

向量是一个具有大小和方向的量,因此只要大小与方向相同则向量也相同,从而向量可以自由平行移动。 向量与点不同,它反映的是从A到B的位移(既包含位移的方向又包含位移的大小),而点仅仅是...

FAT_mt
27分钟前
0
0
Redis缓存穿透、缓存雪崩和缓存击穿

Redis缓存穿透、缓存雪崩 缓存雪崩,是指在某一个时间段,缓存集中过期失效。 产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中...

architect刘源源
49分钟前
11
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部