MVC的弊端git
你可能试着把它放在Model对象里,可是也会很棘手,由于网络调用应该使用异步,这样若是一个网络请求比持有它的model生命周期更长,事情将变的复杂。显然View里面作网络请求那就更格格不入了,所以只剩下Controller了。若这样,这又加重了Massive View Controller的问题。若不这样,何处才是网络逻辑的家呢?github
因为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面试题合集设计模式