【iOS】MVC架构
【iOS】MVC架构一、前言在软件开发过程中除了实现功能之外代码的组织方式同样重要。一个优秀的程序员不仅需要写出能够运行的代码更应该关注代码的可读性、可维护性以及扩展性。随着项目规模不断扩大如果所有代码都堆积在一个ViewController中后期维护和功能扩展都会变得十分困难。因此在开发应用时我们需要合理地设计程序结构而这正是**架构模式Architectural Pattern**存在的意义。一个好的架构通常具有以下特点高内聚High Cohesion低耦合Low Coupling模块职责清晰易于维护易于扩展代码复用率高MVCModel-View-Controller便是最经典、最常见的软件架构模式之一也是 Apple 官方推荐的 iOS 开发架构。二、MVC 简介MVC 是Model模型 View视图 Controller控制器的缩写。MVC 的核心思想是将数据、界面展示以及业务逻辑分离使不同模块各司其职。这样能够降低模块之间的耦合度提高代码的可维护性。1. Model模型职责负责数据存储数据处理部分业务逻辑简单来说Model 就是应用中的数据源。例如微信聊天列表中的用户昵称头像最后一条消息是否屏蔽消息这些都属于 Model 管理的数据。示例interfaceUserModel:NSObjectproperty(nonatomic,copy)NSString*name;property(nonatomic,copy)NSString*message;property(nonatomic,copy)NSString*avatar;end2. View视图职责负责界面展示用户交互事件捕获用户在屏幕上看到的所有内容都属于 View。例如UIViewUILabelUIButtonUIImageViewUITableViewUICollectionView都属于 View 层。View 的特点View 不负责处理业务逻辑。它只负责显示数据接收用户操作3. Controller控制器职责负责协调ModelView之间的交互。Controller 主要完成获取 Model 数据将数据传递给 View 展示接收 View 的事件更新 Model刷新界面因此可以把 Controller 理解为连接 Model 与 View 的桥梁。MVC 工作流程用户操作界面时的数据流转过程用户点击 View ↓ View 捕获事件 ↓ Controller 接收事件 ↓ 网络请求/数据处理 ↓ 更新 Model ↓ Controller 获取最新数据 ↓ 刷新 View ↓ 界面更新完成也可以表示为View → Controller → Model ↓ View ← Controller ← Model三、胖 Model 与 瘦 Model在实际开发中经常会遇到这样的问题Model 获取到的是原始数据而 View 希望显示的是经过处理的数据。例如服务器返回20221124而界面需要显示2022年11月24日那么数据格式化的逻辑应该放在哪里开发过程中逐渐产生了两种思路1. 胖 ModelFat Model特点数据处理逻辑放在 Model 中Controller 直接使用处理后的数据例如interfaceDateModel:NSObjectproperty(nonatomic,copy)NSString*dateString;-(NSString*)displayDate;end-(NSString*)displayDate{return2022年11月24日;}Controller 直接调用self.label.text[model displayDate];优点Controller 更简洁逻辑集中可复用性高缺点Model 可能过于庞大2. 瘦 ModelThin Model特点Model 只存储数据数据处理放在 Controller 中例如NSString*datemodel.dateString;NSString*showDate[NSString stringWithFormat:%年%月%日,year,month,day];优点Model 简单缺点Controller 容易变得臃肿总结Fat ModelModel负责数据 数据处理 Controller尽量轻量Thin ModelModel只负责存储数据 Controller负责大量逻辑实际开发中更推荐适当向 Model 转移业务逻辑让 Controller 保持精简。即Fat Model Skinny Controller四、MVC 的优点1. 职责分离不同模块负责不同任务Model → 数据 View → 展示 Controller → 协调2. 提高可维护性修改界面只需要修改 View。修改数据只需要修改 Model。3. 提高代码复用率一个 Model 可以被多个 View 使用。例如UserModel ↓ 个人主页 好友列表 聊天列表4. 便于团队协作前端开发负责 View。业务开发负责 Controller。数据开发负责 Model。五、MVC 存在的问题随着项目越来越复杂MVC 的缺陷也逐渐暴露出来。1. Controller 过于臃肿这是 iOS 开发中最常见的问题。许多开发者会把网络请求数据解析业务逻辑页面跳转UI 更新全部写在 ViewController 中。最终形成UIViewController 3000 5000 10000 行代码因此产生了著名的Massive View Controller超级臃肿控制器问题。2. View 与 Controller 边界模糊在 UIKit 中UIViewController本身既管理 View又承担 Controller 职责。因此开发过程中经常会出现代码到底该放 View 还是放 Controller的问题。久而久之导致 Controller 代码越来越多。六、MVC 的改进方案为了解决 MVC 的缺点后来出现了许多新的架构模式。1. MVVMModel-View-ViewModel新增ViewModel层。结构View ↑↓ ViewModel ↑↓ Model职责ViewModel获取 Model 数据数据转换数据绑定View 直接使用 ViewModel 提供的数据。优点Controller 大幅瘦身易于单元测试代码更清晰2. MVPModel-View-Presenter结构View ↑↓ Presenter ↑↓ ModelPresenter负责绝大多数业务逻辑。View只负责展示。优点逻辑与界面彻底分离测试方便3. VIPER全称View Interactor Presenter Entity Router职责划分极其细致。优点解耦程度极高可测试性极强适合大型项目缺点模板代码很多学习成本高开发效率较低七、总结MVC 是 iOS 开发中最经典、最基础的架构模式。其核心思想是Model 负责数据 View 负责展示 Controller 负责协调MVC 的优势在于简单易学开发效率高Apple 官方推荐但随着项目规模增大容易出现Massive View Controller问题。因此在实际开发中我们通常会保持 Controller 精简将业务逻辑适当下沉到 Model在复杂项目中使用 MVVM、MVP 或 VIPER对于初学 iOS 的开发者来说MVC 是必须掌握的第一种架构模式也是理解后续 MVVM、MVP、VIPER 等架构的基础。