【发布时间】:2020-10-14 13:04:34
【问题描述】:
我正在寻找一些架构指导。
我在网上看到很多关于 MVVM 以及属性和责任应该放在哪里的困惑。
简而言之,我将 MVVM 理解为:
Model:保存底层数据,应该是可移植的,与View相关项完全解耦
View : 查看指定 UI 布局的相关项
ViewModel : View 相关项,便于更新模型(意图),并格式化模型数据以供 View 显示。
...我认为这是对模式的简洁描述。
我的问题是,对于 iOS/SwiftUI 中的 MVVM,数据模型应该在哪里实例化,CLLocationManager 这样的属性应该在哪里存在?
例如:
-
我看到了将
CLLocationManager放入 AppDelegate 的建议(因为它具有全局范围),但是许多文章都指出它应该作为ViewModel的属性存在。 -
我与 Apple Engineering (WWDC 2020) 进行了交谈,他们表示数据模型本身应该包含对此对象的引用并自行填充。
-
我多次看到
ViewModel中实例化的数据模型。
所以我的问题是,从纯 MVVM 的角度来看,使用一个简单的 CoreLocation 应用程序作为具体示例,并假设一个存储 CLLocation 对象的简单模型,您将在哪里实例化模型,哪个类将CLLLocationManager 作为属性?
【问题讨论】:
-
对于那些试图以“基于意见”的方式关闭的人,我不是在寻找意见。我正在从学术角度寻找权威答案。请正确阅读问题,而不是试图增加当天的元配额。
-
有道理@FrancescoDeliro - 所以我可以通过 ViewModel 拥有的 LocationService 属性访问模型?
-
在某种程度上是的,但是通过这种方式你可以更好地分离关注点,LocationService 有一个责任并且它是独立的。没错,视图模型会直接从服务接收模型数据。
-
感谢@davidev 的输入。这种方法的唯一问题是 View 直接与模型对话,而不是使用 viewmodel 进行更改。实际上并没有真正的模型,因为视图只是拥有位置服务。因此视图与应用程序逻辑耦合。这不是一个好主意,对吧?
-
@Woodstock 是的,你完全正确。我刚刚阅读了有关 MVVM 的信息。看起来在 ViewModel 中创建它会很聪明。我认为这也取决于您如何使用该位置数据?
标签: ios swift mvvm architecture swiftui