MVC
-
M:是数据模型Model,负责处理数据,以及数据改变时发出通知,【Notification、KVO】,Model和View不能直接通信,这样会违背MVC设计模式;
-
V:是视图View,用来展示界面,和用户进行交互,为了解藕合一般不会直接持有或者操作数据层中的数据模型【可以通过target-action、delegate、block等方式解耦】;
-
C:是控制器Controller用来调节model和View之间的交互,可以直接和model和View进行通信,操作model进行数据更新,刷新View。
优点:
View、model低耦合、高复用、容易维护。
缺点:
Controller的代码过于臃肿,如果view与model直接交互会导致view和model之间的耦合性比较大、网络逻辑会加重Controller的臃肿。
MVVM
-
MVVM衍生于MVC,是MVC的一种衍进,促进了UI代码和业务逻辑的分离,抽取Controller中的展示逻辑放到ViewModel里边。
-
M:数据模型model。
-
V:就是View和controller联系到一起,视为一个组件View,view和controller都不能直接引用模型Model,可以引用视图模型ViewModel。view、controller尽量不涉及业务逻辑,让view model去做这些事情,view controller只是一个中间人,负责接收View事件,调用viewmodel的方法,响应ViewModel的变化。
-
VM:ViewModel负责封装业务逻辑,网络处理和数据缓存,使用viewmodel会轻微增加代码量,但是总体上减少了代码的复杂性,
注意事项:
-
view引用viewModel,但反过来不行,因为如果VM跟V产生了耦合,不方便复用。即不要再View model中引入#import UIkit.h,任何视图本身根本的引用都不应该放在View model中(基本要求,必须满足)
-
viewModel可以引用model,但是反过来不行。
优点:
低耦合、可复用、数据流向清晰、而且兼容MVC,便于代码的移植,并且View Model可以拆出来独立开发、方便测试
缺点:
类会增多、viewModel会越来越庞大、调用复杂度增加、双向绑定数据会导致问题调试变得困难。
总结
-
MVVM其实是MVC的变种。MVVM只是帮MVC中的controller瘦身,把一些逻辑代码和网络请求分离出去,不让controller处理更多的东西,不会变的臃肿,MVVM和MVC可以根据实际需求进行灵活选择。
-
MVVM在使用当总,同常会使用双向绑定技术,使得model变化时,viewmodel会自动更新,而viewmodel变化时view也会自动变化,OC中可以用RAC函数响应式框架来实现响应式编程。