【iOS】MVC架构

【iOS】MVC架构

一、前言

在软件开发过程中,除了实现功能之外,代码的组织方式同样重要。

一个优秀的程序员不仅需要写出能够运行的代码,更应该关注代码的可读性、可维护性以及扩展性。随着项目规模不断扩大,如果所有代码都堆积在一个 ViewController 中,后期维护和功能扩展都会变得十分困难。

因此,在开发应用时,我们需要合理地设计程序结构,而这正是**架构模式(Architectural Pattern)**存在的意义。

一个好的架构通常具有以下特点:

  • 高内聚(High Cohesion)
  • 低耦合(Low Coupling)
  • 模块职责清晰
  • 易于维护
  • 易于扩展
  • 代码复用率高

MVC(Model-View-Controller)便是最经典、最常见的软件架构模式之一,也是 Apple 官方推荐的 iOS 开发架构。


二、MVC 简介

MVC 是:

Model(模型) + View(视图) + Controller(控制器)

的缩写。

MVC 的核心思想是:

将数据、界面展示以及业务逻辑分离,使不同模块各司其职。

这样能够降低模块之间的耦合度,提高代码的可维护性。


1. Model(模型)

职责

负责:

  • 数据存储
  • 数据处理
  • 部分业务逻辑

简单来说:

Model 就是应用中的数据源。

例如微信聊天列表中的:

  • 用户昵称
  • 头像
  • 最后一条消息
  • 是否屏蔽消息

这些都属于 Model 管理的数据。

示例

objc 复制代码
@interface UserModel : NSObject

@property(nonatomic, copy) NSString *name;
@property(nonatomic, copy) NSString *message;
@property(nonatomic, copy) NSString *avatar;

@end

2. View(视图)

职责

负责:

  • 界面展示
  • 用户交互事件捕获

用户在屏幕上看到的所有内容都属于 View。

例如:

  • UIView
  • UILabel
  • UIButton
  • UIImageView
  • UITableView
  • UICollectionView

都属于 View 层。

View 的特点

View 不负责处理业务逻辑。

它只负责:

  • 显示数据
  • 接收用户操作

3. Controller(控制器)

职责

负责协调:

  • Model
  • View

之间的交互。

Controller 主要完成:

  1. 获取 Model 数据
  2. 将数据传递给 View 展示
  3. 接收 View 的事件
  4. 更新 Model
  5. 刷新界面

因此可以把 Controller 理解为:

连接 Model 与 View 的桥梁。


MVC 工作流程

用户操作界面时的数据流转过程:

text 复制代码
用户点击 View
        ↓
View 捕获事件
        ↓
Controller 接收事件
        ↓
网络请求/数据处理
        ↓
更新 Model
        ↓
Controller 获取最新数据
        ↓
刷新 View
        ↓
界面更新完成

也可以表示为:

text 复制代码
View → Controller → Model
                     ↓
View ← Controller ← Model

三、胖 Model 与 瘦 Model

在实际开发中,经常会遇到这样的问题:

Model 获取到的是原始数据,而 View 希望显示的是经过处理的数据。

例如:

服务器返回:

text 复制代码
20221124

而界面需要显示:

text 复制代码
2022年11月24日

那么:

数据格式化的逻辑应该放在哪里?

开发过程中逐渐产生了两种思路:


1. 胖 Model(Fat Model)

特点:

  • 数据处理逻辑放在 Model 中
  • Controller 直接使用处理后的数据

例如:

objc 复制代码
@interface DateModel : NSObject

@property(nonatomic, copy) NSString *dateString;

- (NSString *)displayDate;

@end
- (NSString *)displayDate {
    return @"2022年11月24日";
}

Controller 直接调用:

objc 复制代码
self.label.text = [model displayDate];

优点

  • Controller 更简洁
  • 逻辑集中
  • 可复用性高

缺点

  • Model 可能过于庞大

2. 瘦 Model(Thin Model)

特点:

  • Model 只存储数据
  • 数据处理放在 Controller 中

例如:

objc 复制代码
NSString *date = model.dateString;

NSString *showDate =
[NSString stringWithFormat:@"%@年%@月%@日",
 year, month, day];

优点

  • Model 简单

缺点

  • Controller 容易变得臃肿

总结

Fat Model

text 复制代码
Model:负责数据 + 数据处理
Controller:尽量轻量

Thin Model

text 复制代码
Model:只负责存储数据
Controller:负责大量逻辑

实际开发中更推荐:

适当向 Model 转移业务逻辑,让 Controller 保持精简。

即:

Fat Model + Skinny Controller


四、MVC 的优点

1. 职责分离

不同模块负责不同任务:

text 复制代码
Model → 数据
View → 展示
Controller → 协调

2. 提高可维护性

修改界面:

只需要修改 View。

修改数据:

只需要修改 Model。


3. 提高代码复用率

一个 Model 可以被多个 View 使用。

例如:

text 复制代码
UserModel
   ↓
个人主页
好友列表
聊天列表

4. 便于团队协作

前端开发:

负责 View。

业务开发:

负责 Controller。

数据开发:

负责 Model。


五、MVC 存在的问题

随着项目越来越复杂,MVC 的缺陷也逐渐暴露出来。


1. Controller 过于臃肿

这是 iOS 开发中最常见的问题。

许多开发者会把:

  • 网络请求
  • 数据解析
  • 业务逻辑
  • 页面跳转
  • UI 更新

全部写在 ViewController 中。

最终形成:

text 复制代码
UIViewController
    3000+
    5000+
    10000+ 行代码

因此产生了著名的:

Massive View Controller(超级臃肿控制器)

问题。


2. View 与 Controller 边界模糊

在 UIKit 中:

objc 复制代码
UIViewController

本身既管理 View,又承担 Controller 职责。

因此开发过程中经常会出现:

text 复制代码
代码到底该放 View?
还是放 Controller?

的问题。

久而久之导致 Controller 代码越来越多。


六、MVC 的改进方案

为了解决 MVC 的缺点,后来出现了许多新的架构模式。


1. MVVM

Model-View-ViewModel

新增:

text 复制代码
ViewModel

层。

结构:

text 复制代码
View
  ↑↓
ViewModel
  ↑↓
Model

职责

ViewModel:

  • 获取 Model 数据
  • 数据转换
  • 数据绑定

View 直接使用 ViewModel 提供的数据。

优点

  • Controller 大幅瘦身
  • 易于单元测试
  • 代码更清晰

2. MVP

Model-View-Presenter

结构:

text 复制代码
View
 ↑↓
Presenter
 ↑↓
Model

Presenter:

负责绝大多数业务逻辑。

View:

只负责展示。

优点

  • 逻辑与界面彻底分离
  • 测试方便

3. VIPER

全称:

text 复制代码
View
Interactor
Presenter
Entity
Router

职责划分极其细致。

优点

  • 解耦程度极高
  • 可测试性极强
  • 适合大型项目

缺点

  • 模板代码很多
  • 学习成本高
  • 开发效率较低

七、总结

MVC 是 iOS 开发中最经典、最基础的架构模式。

其核心思想是:

text 复制代码
Model
负责数据

View
负责展示

Controller
负责协调

MVC 的优势在于:

  • 简单易学
  • 开发效率高
  • Apple 官方推荐

但随着项目规模增大,容易出现:

text 复制代码
Massive View Controller

问题。

因此在实际开发中,我们通常会:

  • 保持 Controller 精简
  • 将业务逻辑适当下沉到 Model
  • 在复杂项目中使用 MVVM、MVP 或 VIPER

对于初学 iOS 的开发者来说:

MVC 是必须掌握的第一种架构模式,也是理解后续 MVVM、MVP、VIPER 等架构的基础。

相关推荐
caimouse1 小时前
ReactOS 架构
架构
程序员佳佳1 小时前
向量引擎:AI 时代的“记忆中枢“,从原理到落地的完整认知框架
人工智能·gpt·架构·aigc·ai编程
国科安芯1 小时前
ASP7A84AS高精度抗辐照线性稳压器技术特性与应用分析
单片机·嵌入式硬件·安全·架构
阿狸猿1 小时前
论模型驱动架构设计方法及其应用
架构
金融支付架构实战指南1 小时前
微服务DDD落地规范:内部抛异常、RPC外层Result封装
微服务·rpc·架构·错误码
鹤卿1231 小时前
iOS OC NSUserDefaults
macos·ios·objective-c
C137的本贾尼1 小时前
MySQL 整体架构与存储引擎对比
数据库·mysql·架构
caimouse1 小时前
Reactos 第 4 章 对象管理 — 4.6 对象的访问控制 / 4.7 句柄的遗传和继承
开发语言·windows·架构
2601_955767421 小时前
移动OLED屏幕偏振光缺失的补偿方案:圆偏振光还原与磁控溅射AR协同光学系统设计
ios·ar·iphone·圆偏振光护眼·iphone17护眼钢化膜·#观复盾护景贴