【问题标题】:Swift MVVM Example with Business & Data Layers带有业务和数据层的 Swift MVVM 示例
【发布时间】:2017-06-20 06:43:30
【问题描述】:

我遇到的大多数 Swift MVVM 示例都使用依赖注入将模型注入 ViewModel,然后将 ViewModel 注入 ViewController。通常建议在 AppDelegate 中将这种注入作为单例处理。这对于简单的例子来说都很好。

然而,在现实世界中,“模型”实际上不仅仅是一个 DTO 对象,它假定返回模型/DTO 的业务和数据层。因此,将模型注入 AppDelegate 级别的 ViewModel 是不现实的,因为 View/ViewController 将触发实际的数据刷新。所以模型注入需要在其他地方进行。

此外,大多数示例直接从 ViewModel 转到 DataAccess,这导致 ViewModel 包含大量业务逻辑,而理想情况下它应该只保存视图的状态。

有人可以转发一个全面的端到端 Swift MVVM 示例,其中包含离散分离的业务和数据层。为了使这个问题不是基于意见,而是采用问答格式,示例应具有:

  • 独立的业务逻辑层
  • 独立的数据访问逻辑层
  • 分离模型/DTO(仅状态对象)

例子也应该说明清楚:

  • 依赖注入发生的地方
  • 有明确定义的调用 上述定义层之间的层次结构

【问题讨论】:

  • 这实际上是一个非常相关的问题,我也在寻找答案。

标签: ios swift mvvm business-logic data-access


【解决方案1】:

视图模型应该是协议。协议在 Swift 中非常强大,它们使组件尽可能地解耦。这也有利于测试。这是一个简单的例子:

// the view model
protocol ArticleDisplayable {
    func getTitle() -> String
}

// A model
struct News: ArticleDisplayable {
    let newsTitle: String

    func getTitle() -> String {
        return newsTitle
    }
}

// Another model
struct BlogPost: ArticleDisplayable {
    let postTitle: String

    func getTitle() -> String {
        return postTitle
    }
}

您可以以类似的方式处理模型和其他组件(网络、JSON 解析、视图控制器、集合视图单元等)之间的所有其他交互。基本上,其他组件只会处理 ArticleDisplayable 对象,不会与任何模型耦合。

【讨论】:

  • getTitle() 方法有点不寻常,ObjectiveC/Swift getter 通常不带get 前缀。
猜你喜欢
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2014-04-23
  • 2017-04-29
  • 1970-01-01
  • 2023-03-10
  • 2021-02-11
  • 2011-04-12
相关资源
最近更新 更多