标签:更新 ica ssi 说明 vat rop value ext tableview
在 iOS 开发中,MVC(Model View Controller)是构建iOS App的标准模式,是苹果推荐的一个用来组织代码的权威范式。Apple甚至是这么说的。在MVC下,所有的对象被归类为一个Model,一个View,和一个Controller。Model持有数据,View显示与用户交互的界面,而ViewController调解Model和View之间的交互。现在,MVC 依然是目前主流客户端编程框架,但同时它也被调侃成Massive View Controller(重量级视图控制器),想必开发者在开发中无可避免被下面几个问题所困扰:
厚重的ViewController
遗失的网络逻辑(无立足之地)
较差的可测试性
为了避免和解决上述问题的产生,从MVC引申出来一种维护性较强、耦合性低的新的架构MVVM(Model View View-Mode),MVVM正式规范了视图和控制器紧耦合的性质,并引入新的组件。MVVM主要目的是为了分离视图(View)和模型(Model)。
本文只是分享一下笔者对MVC和MVVM的一些见解,在此抛砖引玉,希望能为存在对MVC和MVVM迷茫的广大开发者提供一点思路,少走一些弯路,填补一些细坑。文章仅供大家参考,若有不妥之处,还望不吝赐教,欢迎批评指正。
1.MVC之间的关系
任何一个正经开发过软件的人都熟悉MVC,它意思是Model View Controller, 是一个在复杂应用设计中组织代码的公认模式,它们之间的结构关系如下:
我们看到的只是一个苹果 典型的MVC 设置。view将用户交互通知给controller。view controller通过更新model来反应状态的改变。model(通常使用Key-Value-Observation)通知controller来更新他们负责的view。大多数iOS应用程序的代码使用这种方式来组织。然而,典型的MVC架构不适用于当下的iOS开发。尽管从技术上看View 和 Controller 是相互独立的,但事实上它们几乎总是结对出现,一个 View 只能与一个 Controller 进行匹配,反之亦然。既然如此,那我们为何不正规化它们的连接:
因此,M-VC 可能是对 iOS 开发中的 MVC模式更为准确的解读,同时更也准确地描述了我们日常开发可能已经编写的 MVC 代码,但它并没有做太多事情来解决 iOS 应用中日益增长的重量级视图控制器的问题。(PS:躺枪了没...)
举例说明:
若假设笔者利用MVC的设计模式来开发此界面,那想必是这样的。
M:SUGoods(商品模型Model)
V:SUGoodsCell(展示商品数据的View,自定义的 UITableViewCell)
C:SUHomeViewController (首页控制器Controller)
控制器(SUHomeViewController)代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
|
- (void) requestRemoteData { // 1.发起网络请求,获取到服务器的数据,并将其转化成模型数据(`SUGoods`) // 2.添加到数据源(`dataSource`) // 3.最后刷新表格`[self.tableView reloadData]`,配置`SUGoodsCel`l即可 } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { SUGoodsCell *cell = [tableView dequeueReusableCellWithIdentifier:@ "Goods" ]; cell.goods = self.dataSource[indexPath.row]; return cell; } |
View(SUGoodsCell)代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
SUGoodsCell.h @class SUGoods; @interface SUGoodsCell : UITableViewCell @property (nonatomic, strong) SUGoods *goods; @end SUGoodsCell.m @implementation SUGoodsCell - (void)setGoods:(SUGoods *)goods { _goods = goods /// config data .... } @end |
都写到这份上了,大家用脚趾头想想,这个SUGoodsCell,正是由View直接来调用Model,所以事实上典型的MVC的原则已经违背了,但是这种情况是一直发生的甚至于人们不觉得这里有哪些不对。如果严格遵守MVC的话,你会把对cell的设置放在Controller中,不向View传递一个Model对象,这样就会大大增加Controller的体积。所以说,这哪里是典型的MVC设计模式,这分明是M-VC设计模式呀。简而言之,在理想的世界里,MVC也许工作的很好。然而,我们生活在真实的世界,谢谢(PS:让梦想实现的最好的方式,就是醒来!!!)。
2.MVC的弊端
MVC的利弊大家想必是有目共睹的,Massive View Controller的说法也并非空穴来风的。让我们一起探讨MVC的弊端,剖析问题产生原因,打造一个轻量级的ViewController,明确MVC设计模式中各个角色的职责。
厚重的View Controller
网络数据的请求及后续处理,本地数据库操作,以及一些带有工具性质辅助方法都加大了Massive View Controller的产生。
遗失(无处安放)的网络逻辑
苹果使用的MVC的定义是这么说的:所有的对象都可以被归类为一个model,一个view,或是一个controller。
你可能试着把它放在Model对象里,但是也会很棘手,因为网络调用应该使用异步,这样如果一个网络请求比持有它的model生命周期更长,事情将变的复杂。显然View里面做网络请求那就更格格不入了,因此只剩下Controller了。若这样,这又加剧了Massive View Controller的问题。若不这样,何处才是网络逻辑的家呢?
较差的可测试性
由于View Controller混合了视图处理逻辑和业务逻辑,分离这些成分的单元测试成了一个艰巨的任务。若一个Massive View Controller有上万行代码,要你编写个单元测试,我敢保证,你不是想写,你是想死,分分钟填表走人。
一种可以很好地解决Massive View Controller问题的办法就是将 Controller 中的展示逻辑抽取出来,放置到一个专门的地方,而这个地方就是 viewModel 。MVVM衍生于MVC,是对 MVC 的一种演进,它促进了 UI 代码与业务逻辑的分离。它正式规范了视图和控制器紧耦合的性质,并引入新的组件。他们之间的结构关系如下:
MVVM 的基本概念
MVVM 的注意事项
MVVM 的使用建议
MVVM 的优势
MVVM 的弊端
主要成本在于:
MVC的设计模式也并非是病入膏肓,无药可救的架构,最起码目前MVC设计模式仍旧是iOS开发的主流框架,存在即合理。针对文章所述的弊端,我们依旧有许多可行的方法去避免和解决,从而打造一个轻量级的ViewController。
MVVM是MVC的升级版,完全兼容当前的MVC架构,MVVM虽然促进了UI 代码与业务逻辑的分离,一定程度上减轻了ViewController的臃肿度,但是View和ViewModel之间的数据绑定使得 MVVM变得复杂和难用了,如果我们不能更好的驾驭两者之间的数据绑定,同样会造成Controller 代码过于复杂,代码逻辑不易维护的问题。
一个轻量级的ViewController是基于MVC和MVVM模式进行代码职责的分离而打造的。MVC和MVVM有优点也有缺点,但缺点在他们所带来的好处面前时不值一提的。他们的低耦合性,封装性,可测试性,可维护性和多人协作便利大大提高了开法效率。
同时,我们需要保持的是一个拥抱变化的心,以及理性分析的态度。在新技术的面前,不盲从,也不守旧,一切的决策都应该建立在认真分析的基础上,这样才能应对技术的变化。
标签:更新 ica ssi 说明 vat rop value ext tableview
原文地址:https://www.cnblogs.com/kaleidoscope/p/9765130.html