模型视图 View-Model

2025年3月17日 | 阅读 3 分钟

在上一节中,我们讨论了 MVC 设计模式,它易于理解和使用。 然而,MVC 也有一些缺点,导致了一种新的设计模式的演变,即模型-视图-视图模型。 在本教程的这一部分,我们将详细讨论 MVVM 的组件。 我们还将探讨模型-视图-控制器设计模式的局限性。

什么是 MVVM?

MVVM(模型-视图-视图模型)是一种 iOS 架构设计模式,我们将对象分离成三个主要组件。

  • 模型: 它包含应用程序数据。 它负责数据解析和数据持久化。
  • 视图: 它负责在屏幕上显示模型数据,包括视觉元素和控件。 它是 UIView 的子类,高度可重用。
  • 视图模型: 它包含将模型数据转换为值并将其传递给视图的业务逻辑。 在 MVVM 中,所有业务逻辑(包括数据操作)都发生在视图模型中。
iOS Model View View-Model

MVVM 在 MVC 设计模式中添加了一个新的组件视图模型,从而可以最小化视图控制器的角色,并且业务逻辑可以在视图模型中进行。

MVC 的问题

MVC 最常见的问题是数据格式化。 在 MVC 中,模型包含应用程序的数据。 在开发 iOS 应用程序时,需要在将数据呈现给用户之前对其进行格式化。

假设在一个 iOS 应用程序中,需要向用户显示日期,而日期由服务器返回。 但是,如果服务器将日期以长毫秒格式返回,并且我们向用户显示服务器返回的确切日期,那么用户将如何理解日期格式。 因此,需要使用日期格式化程序将此日期格式化为字符串。

在 MVC 中,问题在于格式化发生的位置。 并不需要告诉模型有关向用户显示的数据。 模型不需要理解向用户显示的数据;因此,唯一可用于放置格式化代码的对象是控制器,因为控制器在拥有如此多的业务逻辑(包括数据源和委托方法)之后已经很重了。 因此,控制器在 MVC 中变得非常重,因为所有数据操作任务也都在控制器中进行。

在哪里使用 MVVM

MVVM 提供了对 MVC 中重量级控制器的问题的解决方案。 它在方案中添加了第四个组件,即视图模型。 视图模型负责管理数据操作任务,并且它还通过视图控制器将模型的数据传输到视图来管理模型。 这种模式可用于我们需要将模型转换为另一种用于视图的表示形式。 例如,我们可以使用视图模型将日期对象转换为格式化的字符串,将十进制值转换为格式化的货币字符串等。 这种模式很好地补充了 MVC。 目的在于通过添加另一个组件来最小化视图控制器的角色。 但是,视图控制器仍然执行一些主要处理,包括出口和将格式化数据注入到出口中。

MVVM 项目架构

下图定义了遵循 MVVM 作为设计模式的 XCode 项目的架构。

iOS Model View View-Model