人猿星球iOS相关iOS之设计模式

iOS 关于MVC和MVVM设计模式的那些事

2017-06-08  本文已影响5758人  CoderMikeHe
一、概述
二、MVC(Model View Controller)
  1. MVC之间的关系
    任何一个正经开发过软件的人都熟悉MVC,它意思是Model View Controller, 是一个在复杂应用设计中组织代码的公认模式,它们之间的结构关系如下:
    MVC示意图.png

我们看到的只是一个苹果 **典型的MVC ** 设置。view将用户交互通知给controllerview controller通过更新model来反应状态的改变。model(通常使用Key-Value-Observation)通知controller来更新他们负责的view。大多数iOS应用程序的代码使用这种方式来组织。然而,典型的MVC架构不适用于当下的iOS开发。尽管从技术上看ViewController 是相互独立的,但事实上它们几乎总是结对出现,一个 View 只能与一个 Controller 进行匹配,反之亦然。既然如此,那我们为何不正规化它们的连接:

MVC示意图2.png

因此,M-VC 可能是对 iOS 开发中的 MVC模式更为准确的解读,同时更也准确地描述了我们日常开发可能已经编写的 MVC 代码,但它并没有做太多事情来解决 iOS 应用中日益增长的重量级视图控制器的问题。(PS:躺枪了没...)

举例说明:


M-VC_Example.png

若假设笔者利用MVC的设计模式来开发此界面,那想必是这样的。

控制器(SUHomeViewController)代码实现

- (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)代码实现

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:让梦想实现的最好的方式,就是醒来!!!)。

  1. MVC的弊端
    MVC的利弊大家想必是有目共睹的,Massive View Controller的说法也并非空穴来风的。让我们一起探讨MVC的弊端,剖析问题产生原因,打造一个轻量级的ViewController,明确MVC设计模式中各个角色的职责。
三、MVVM(Model View View-Mode)

一种可以很好地解决Massive View Controller问题的办法就是将 Controller 中的展示逻辑抽取出来,放置到一个专门的地方,而这个地方就是 viewModelMVVM衍生于MVC,是对 MVC 的一种演进,它促进了 UI 代码与业务逻辑的分离。它正式规范了视图和控制器紧耦合的性质,并引入新的组件。他们之间的结构关系如下:

MVVM示意图.png
四、总结
五、期待
  1. 文章若对您有点帮助,请给个喜欢❤️,毕竟码字不易;若对您没啥帮助,请给点建议💗,切记学无止境。
  2. 针对文章所述内容,阅读期间任何疑问;请在文章底部批评指正,我会火速解决和修正问题。
  3. GitHub地址:https://github.com/CoderMikeHe
六、实战篇
七、参考链接
上一篇下一篇

猜你喜欢

热点阅读