【问题标题】:Pure MVVM with SwiftUI & CoreLocation [closed]带有 SwiftUI 和 CoreLocation 的纯 MVVM [关闭]
【发布时间】: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


【解决方案1】:

我会使用面向服务的架构方法。您可以拥有由LocationService 类实现的LocationServiceProtocol,您可以将其注入到视图模型中。此类负责实例化您的 Location 模型并具有 CLLocationManager 属性。通过这种方式,您可以处理高级和低级实现之间的交互。

【讨论】:

  • 最后一个想法,viewModel 的这种方法是在没有视图请求的情况下更改模型。它基于自己对位置管理器的所有权来执行此操作。这不违反 MVVM 吗?
  • 很高兴为@Woodstock 做出贡献。如果我正确理解了您的问题,视图应该请求更新位置信息并以适当的方式处理它。视图模型将通过服务侦听更新并与视图进行通信。
猜你喜欢
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2020-07-13
相关资源
最近更新 更多