ios - SwiftUI 和 MVVM 设计模式

标签 ios swift design-patterns mvvm swiftui

我正在努力思考如何使用 MVVM 设计模式和 SwiftUI 实现以下目标。

我只想拥有 1 个网络操作队列实例(使用 OperationQueue),其中任何需要发送任何网络请求的 View 模型,但我听说创建单例不是首选,我应该传递网络队列对象在需要的地方。

因此,如果我在 Scene Delegate 中创建网络操作队列的实例并将它们传递到 ContentView 初始化程序并将其存储在一个对象中,然后传递到随后创建的 View 中。

根据我的理解,View 应该只拥有 ViewModel,这似乎不是好的 MVVM 设计实践?

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

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

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

谢谢

最佳答案

我们不应该仅仅因为获取全局变量的简单方法而创建单例,但这并不意味着我们永远不应该使用它们。

就您而言,如果我理解正确的话,您基本上是在创建一个可供整个应用程序使用的服务。您可以 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。数据与任何特定 View 无关,也不与特定模型相关;它只是您可以在任何需要它的 ViewModel 中调用的服务。

关于ios - SwiftUI 和 MVVM 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57538431/

相关文章:

ios - 将多个图像拖到 Xcode 7.x 中损坏的 iOS 模拟器? (7.2)

ios - 无法保存 plist ios

ios - 如何为 iOS 的 FirebaseUI 登录添加背景图片?

java - 如何在 Java 代码中传递通用枚举键

ios - UIScrollView 不在 iOS 6 和 7 中以编程方式滚动

ios - 如何在 objective-c 中为此代码创建函数

ios - Segue 不将数据传递给 ViewController

ios - swift ;导航 Controller 中的多个路径

.net - ASP.NET——如何在不过度设计的情况下有效地使用设计模式!

c# - 使用接口(interface) - 设计模式方面