1

所以,我目前正在将一个非常大的项目重构为 VIPER 架构,它的大部分模块视图都是 UITableViews。我发现了互联网上几乎所有关于 VIPER 和 UITableView 的话题,但有一件事仍然不清楚:我应该将 ViewModel 存储在哪里,我真的需要它们吗?

例如,我有一个带有 UITableViewController 的简单 VIPER 模块,我需要显示项目列表。Interactor 使用我解码为 Codable 结构的一些项目的数组来获取 JSON。然后我通过 InteractorOutput 协议将这些结构的数组从交互器推回演示器。现在我有两个问题:

  1. 我是否必须使用另一个数据模型 (ViewModel) 在视图中显示数据,还是可以使用现有的 Codable Struct?

  2. 我应该在哪里存储我的 ViewModel?在 Presenter 内部并从 View 中请求数据,如下所示:presenter.getData(forItemAt: indexPath.row)。或者我必须将 ViewModel 数组推送到 View 并要求 View 显示它们?

4

1 回答 1

0

https://TheSwiftDev.com/the-ultimate-viper-architecture-tutorial中所述,

  • UITableView 被隔离在视图区域内。
  • 本身没有视图模型。其他架构的目的在 VIPER 中以不同的方式划分,主要在演示者区域,但没有公开了解视图本身(而是专注于用例的业务规则)。VIPER 视图区域中的 UI 视图至少符合一个用例。从交互器区域(采集/存储)通过演示者区域(业务/应用程序域规则执行/处理)到视图区域(反之亦然)流动的数据是在不直接了解特定操作系统的特定 UI 结构及其参数需求的情况下建模的. 当穿越 VIPER 区域时,实体被建模为可移植(即使尚未)到其他操作系统上的其他 UI。例如,在为 iOS/iPadOS/WatchOS 应用程序开发时,区域间的事件交换和 完成数据/实体后,它们至少与 iOS/iPadOS/WatchOS UI 视图构造及其参数的特性无关,因此除了视图和路由器 {interactor、presenter、entities} 之外的 4 个 VIPER 区域在 MacOS 中保持不变同一应用程序的版本。小心(例如,所有非 Apple 平台上的 Swift;OpenCombine 框架而不是 Apple Combine 框架用于区域间效应反应数据流)这个概念也可以外推到应用程序的 Android 和 UWP 版本,但是以 Apple 为中心的部分交互器区域也需要更改,这就是隔离区域中划分的每个主题的原因,以便它不会污染其他区域(如 Massive View Controller 架构所示)。其参数,以便在同一应用程序的 MacOS 版本中,除了视图和路由器 {interactor、presenter、entities} 之外的 4 个 VIPER 区域保持不变。小心(例如,所有非 Apple 平台上的 Swift;OpenCombine 框架而不是 Apple Combine 框架用于区域间效应反应数据流)这个概念也可以外推到应用程序的 Android 和 UWP 版本,但是以 Apple 为中心的部分交互器区域也需要更改,这就是隔离区域中划分的每个主题的原因,以便它不会污染其他区域(如 Massive View Controller 架构所示)。其参数,以便在同一应用程序的 MacOS 版本中,除了视图和路由器 {interactor、presenter、entities} 之外的 4 个 VIPER 区域保持不变。小心(例如,所有非 Apple 平台上的 Swift;OpenCombine 框架而不是 Apple Combine 框架用于区域间效应反应数据流)这个概念也可以外推到应用程序的 Android 和 UWP 版本,但是以 Apple 为中心的部分交互器区域也需要更改,这就是隔离区域中划分的每个主题的原因,以便它不会污染其他区域(如 Massive View Controller 架构所示)。
  • 演示者区域根本不应该知道或访问 UITableView 构造。因此,presenter.getData(forItemAt: indexPath.row) 将被替换为处理实体集合的演示者,其中实体集合可能在视图区域中作为 iOS/iPadOS/WatchOS 上的 UITableView 进行 UI 查看,但获得 UI-在 MacOS 或 Android 或 UWP 上查看完全不同,可能根本不是表格,而是路由器导航的 2D 图标/选项数组。您的“或者 [do] 我 [需要] 必须将 ViewModel 数组推送到 View 并要求 View 显示它们?” 几乎是一针见血,除了 VIPER 架构在那里没有使用 ViewModel 一词;改用实体一词(即,与 UI 和操作系统分离的纯应用程序域实体)。
  • Codable 是 Apple 的 JSON 处理中的一个接口。因此,需要将其隔离在交互区域内,以便可移植(真实的或预期的良好心理卫生)到非 Apple 操作系统。JSON 交互器的输入(和输出)需要以纯应用程序域的实体表示,而不需要了解 SwiftUI 中的 Codable 等不可移植框架。需要将表示 JSON 处理输出的以 Apple 为中心的方式转换为表示这些等效实体的纯应用程序域方式。
于 2021-04-12T15:15:31.227 回答