SwiftUI和MVVM设计模式

麦可

  我试图弄清楚如何使用SwiftUI的MVVM设计模式来实现以下目标。

我只想拥有一个网络操作队列实例(使用OperationQueue),在该实例中任何需要发送任何网络请求的视图模型都可以,但是我听说创建Singleton并不是首选,我应该将网络队列对象传递给它是必需的。

因此,如果我在“场景委托”中创建网络操作队列的实例并将其传递到ContentView初始化程序中,并将其存储在该对象中,然后传递到随后创建的视图中。

从我了解的观点来看,这似乎不是良好的MVVM设计实践,而View应该仅拥有ViewModel?

实现此目标的最佳方法是什么?

编辑:对此进行了进一步的思考,我可以通过其构造函数将其传递到视图中,然后在构造函数中,我可以创建视图模型并将其直接传递给视图模型,这样视图就不会拥有任何东西。

但是我仍然需要一个单例,那么如何将单例作为依赖项注入而不是全局使用呢?

谢谢

f属

我们不应该出于获得全局变量的简便方法而创建单例,但这并不意味着我们永远不要使用它们。

就您而言,如果我理解正确,那么您基本上是在创建可被整个应用程序使用的服务。您可以A)使用所需的网络功能创建一个可重用的类(并在需要的地方实例化),或者B)创建一个具有单例实例的类,该类可以在任何地方轻松访问。

例如,如果您需要保持所有调用者都具有的某种状态,或者需要保持等待队列,那么单例将是一个更好的选择。

选项A

class NetworkService {

    init() {
        // init
    }

    // Your properties and methods
    func someFunction() {}
}

在ViewModel中的用法:

let networkService = NetworkService()
networkService.someFunction()

选项B

class NetworkService {
    static let shared = NetworkService()
    private let queue : Any?

    // Your properties and methods
    func someFunction() {}
}

用法:

NetworkService.shared.someFunction()

无论哪种方式,这仍然是MVVM。数据与特定视图无关,也与特定模型无关。它只是您需要在任何需要它的ViewModel中调用的服务。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章