我遇到的大多数 Swift MVVM 示例都使用依赖注入(inject)将模型注入(inject) ViewModel,然后将 ViewModel 注入(inject) ViewController。通常建议在 AppDelegate 中将此注入(inject)作为其单例进行处理。这对于简单的例子来说都很好。
然而在现实世界中,“模型”实际上不仅仅是一个 DTO 对象,它假定返回模型/DTO 的业务和数据层。因此,将模型注入(inject) AppDelegate 级别的 ViewModel 是不现实的,因为 View/ViewController 将触发实际的数据刷新。因此模型注入(inject)需要在其他地方进行。
此外,大多数示例直接从 ViewModel 转到 DataAccess,这导致 ViewModel 吸收了大量业务逻辑,而理想情况下它应该只保存 View 的状态。
有人可以转发一个全面的端到端 Swift MVVM 示例,该示例具有离散分离的业务层和数据层。为了让这个问题不是基于意见而是以问题/答案的形式出现,这个例子应该有:
- 独立的业务逻辑层
- 独立的数据访问逻辑层
- 分离模型/DTO(仅状态对象)
例子也应该说明清楚:
- 依赖注入(inject)发生的地方
- 有明确定义的调用 上述定义层之间的层次结构
最佳答案
View 模型应该是协议(protocol)。协议(protocol)在 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 解析、 View Controller 、 Collection View 单元等)之间的所有其他交互。基本上,其他组件只会处理 ArticleDisplayable 对象,不会耦合到任何模型。
关于ios - 具有业务和数据层的 Swift MVVM 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42015020/