使用KVO体会

20110625

学习并使用KVO有段时间了,在之前也简单的介绍了KVO机制,

这种机制提供了监听某些类属性变化的机制.在MVC中,简单的说,通过监听M的变化,可以及时更新V.因为监听属性明确,当有变化时就直接传递到观察者.

考虑这样一种情况:请求某网站的rss,并将内容解析出来在tableview中显示出来.因为网络请求以及数据解析需要时间,如果我们把获得的全部数据解析后再显示出来,在用户体验上就会非常不好:用户启动程序后,风火轮可能需要转很久,然后突然就冒出来一大堆的数据.

改进的方法之一就是使用KVO,当有一条数据解析好后,就解析出来,直到全部数据解析完.具体的实现步骤:

  1. 在controller注册一个属性,通常是NSMutableArray,然后实现KVO的accessory.
  2. 实现KVO的方法--observeValueForKeyPath:ofObject:change:context:,在此方法中我们设置好属性变化时view的变化情况.具体说来,就是当NSMutableArray添加数据,替换或删除数据时的UI更新操作
  3. 当数据有变化时,调用属性相应的方法,来激发KVO机制.

可是某一天,突然有人问我:为什么需要使用KVO啊,你使用KVO代码量未必会减少,并且更新UI的操作我完全可以在数据有变化时进行”手工”操作啊.

当时我确实被问到了,可是细细想来KVO还是有不少”好处”的:

  1. 避免了所谓的胶水代码,也就是说我不需要每次在有数据更新的地方都加上UI的更新操作
  2. 你或者说,数据更新的来源单一,我通常只需要在一处实现UI更新即可.那么考虑下,在手机平台上, 通常为了用户体验会将获取数据操作放到后台或次线程中,那么你更新UI操作又必须回到主线程.而使用KVO你就不需要操这些心.
  3. 从程序的结构而言,程序“”分离“”的比价彻底:获取数据的部分和UI更新的部分没有交叠,由KVO将两者联系了起来,这样看来难道不算是优雅吗?

ps:欢迎大家一起讨论KVO的使用心得.

posted on 2011-06-26 21:44  scorpiozj  阅读(1805)  评论(0编辑  收藏  举报