MVC的弊端
你可能试着把它放在Model对象里,但是也会很棘手,因为网络调用应该使用异步,这样如果一个网络请求比持有它的model生命周期更长,事情将变的复杂。显然View里面做网络请求那就更格格不入了,因此只剩下Controller了。若这样,这又加剧了Massive View Controller的问题。若不这样,何处才是网络逻辑的家呢?
由于View Controller混合了视图处理逻辑和业务逻辑,分离这些成分的单元测试成了一个艰巨的任务。
一种可以很好地解决Massive View Controller问题的办法就是将 Controller 中的展示逻辑抽取出来,放置到一个专门的地方,而这个地方就是 viewModel 。MVVM衍生于MVC,是对 MVC 的一种演进,它促进了 UI 代码与业务逻辑的分离。它正式规范了视图和控制器紧耦合的性质,并引入新的组件。他们之间的结构关系如下:
MVVM 中,view 和 view controller正式联系在一起,我们把它们视为一个组件view 和 view controller 都不能直接引用model,而是引用视图模型(viewModel)viewModel 是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他代码的地方MVVM会轻微的增加代码量,但总体上减少了代码的复杂性view 引用viewModel ,但反过来不行(即不要在viewModel中引入#import UIKit.h,任何视图本身的引用都不应该放在viewModel中)(PS:基本要求,必须满足)viewModel 引用model,但反过来不行* MVVM 的使用建议MVVM 可以兼容你当下使用的MVC架构。MVVM 增加你的应用的可测试性。MVVM 配合一个绑定机制效果最好(PS:ReactiveCocoa你值得拥有)。viewController 尽量不涉及业务逻辑,让 viewModel 去做这些事情。viewController 只是一个中间人,接收 view 的事件、调用 viewModel 的方法、响应 viewModel 的变化。viewModel 绝对不能包含视图 view(UIKit.h),不然就跟 view 产生了耦合,不方便复用和测试。viewModel之间可以有依赖。viewModel避免过于臃肿,否则重蹈Controller的覆辙,变得难以维护。View 可以独立于Model变化和修改,一个 viewModel 可以绑定到不同的 View 上viewModel里面,让很多 view 重用这段视图逻辑viewModel,设计人员可以专注于页面设计MVVM 模式可以针对 viewModel来进行测试Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。Item对象,如果Item对象中还有类似数组,就很头疼。Item)的可复用程度才高,否则容易出现类型爆炸,提高维护成本。NSDictionary/NSArray直观。MVC的设计模式也并非是病入膏肓,无药可救的架构,最起码目前MVC设计模式仍旧是iOS开发的主流框架,存在即合理。针对文章所述的弊端,我们依旧有许多可行的方法去避免和解决,从而打造一个轻量级的ViewController。MVVM是MVC的升级版,完全兼容当前的MVC架构,MVVM虽然促进了UI 代码与业务逻辑的分离,一定程度上减轻了ViewController的臃肿度,但是View和ViewModel之间的数据绑定使得 MVVM变得复杂和难用了,如果我们不能更好的驾驭两者之间的数据绑定,同样会造成Controller 代码过于复杂,代码逻辑不易维护的问题。ViewController是基于MVC和MVVM模式进行代码职责的分离而打造的。MVC和MVVM有优点也有缺点,但缺点在他们所带来的好处面前时不值一提的。他们的低耦合性,封装性,可测试性,可维护性和多人协作便利大大提高了开法效率。更多:iOS面试题合集
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。