Objective-C结合RAC实现KVO广播功能

如果不想看下面的文字,看这里:示例代码

如果需要监听对象A属性B值的变化,我们通常会考虑用KVO来实现,facebook开源了一个库简化KVO监听与移除监听的流程:

https://github.com/facebook/KVOController

试想一下,如果有很多很多地方需要监听对象A属性B值的变化呢?方法有很多,我随便说说:

1.在这个对象A属性B的setter方法里post消息,需要监听的地方接受监听消息。

2.每一个需要监听的地方进行KVO代码编写,观察对象A属性B值的变化。

3.创建一个观察者来来监听对象A属性B值的变化,然后通过回调广播出去。

当然,还有一些其他的设计模式都可以实现这个功能。我这里讲讲第3点我的实现思路。

1.监听属性的变化:

Objective-C结合RAC实现KVO广播功能_第1张图片
监听token的变化

这段代码的作用就是使用RAC来观察token的变化,如有变化,就通过block的方式广播给所有需要监听的对象。监听放到Appdelegate或者其他比较早运行模块都行。

2.注册监听方法:

Objective-C结合RAC实现KVO广播功能_第2张图片
注册监听

注释写得很清楚了,每个对象只注册1次,对象销毁前移除监听。需要说明的是,对象与回调的关联使用的是对象内存地址与block,如果直接使用对象,就算传参是weakSelf,在添加到array的时候retainCount加1,在RAC释放那里就不执行了,造成内存泄漏。

3.注册与移除注册代码实现:

Objective-C结合RAC实现KVO广播功能_第3张图片
注册与移除注册

  4.使用示例:

Objective-C结合RAC实现KVO广播功能_第4张图片
使用示例

讲完了,我不喜欢啰里八嗦,就是分享一个思路,就像REST/AJAX一样没啥新技术,如果有更棒的主意,请留言。

你可能感兴趣的:(Objective-C结合RAC实现KVO广播功能)