ReactiveCocoa简称RAC,说到MVVM好多都会提到RAC,但其实MVVM和RAC没有必然的联系。也就是说我可以只用MVVM设计模式来搭建自己的框架而不用RAC。
简单介绍下MVVM:其实网络上有很多资料了,这里只做下我觉的有些注意的和一些总结。
和大家熟悉的MVC对比,MVC中的view controller 有一部分是属于view一部分属于逻辑,这样view controller就会很重,MVVM就是为了给view controller减负的,v=view+view controller,vm就是逻辑层。正常是一个view controller对应一个viewmodel。(如果还是不明白的话请移步百度,谷歌)
关于RAC:可以参考 //www.greatytc.com/p/87ef6720a096 http://www.cocoachina.com/ios/20150123/10994.html https://github.com/Draveness/Analyze/blob/master/contents/ReactiveObjC/RACSignal.md
简单来说RAC就是集合了各种通知模式实行双向绑定,在ReactiveCocoa术语中这个叫做信号(signal),由RACSignal类表示。并提供统一的格式供开发者调用,让开发者不在需要关心action、delegate、KVO、callback等处理。(有个demo 传不上去,有需要的找我拿)
这样就实行了ViewModel和view的双向绑定。view上文本框输入内容变化通知到ViewModel,并在viewmodel上进行相应的逻辑处理。ViewModel则去负责数据加工并通过通知机制让View响应ViewModel的改变。
看了这个demo有没有觉得这样写的代码量好像并没有少,如果是简单的逻辑可能还会比正常用法的代码量多。还有就是你需要熟练掌握RAC这个新框架。学习时间和熟悉程度都是成本。我最后没有用RAC的原因:如框架代码量大,bug难已定位,代码量多等。(当然这个要看个人的习惯和项目需求)如果你也和我一样的观点,但又想用MVVM可以往下看。
MVC会让Controller的代码量过多,可维护性和可阅读性差,这让我们不得不想办法给Controller减肥。 我们目前项目的做法是用Model-View-ViewModel但是不用双向绑定,也就是我们可以把Controller的逻辑抽到ViewModel里面实现,但是不用ReactiveCocoa框架。 那ViewModel和view如何通信呢? 我们现在的做法是ViewModel是Controller的一个属性,这样Controller就很容易获取到ViewModel的值,view上的值也很容易传给ViewModel,。如果只在需要监听值变化的话,就直接添加KVO或block。如果觉的系统的KVO不好用的话,可以自己写一个用block来实现KVO。不过需要看下KVO的底层原理。
以上观点纯属个人建议,如有不同意见观点的欢迎指教。