SwiftUI 和 MVVM 设计模式
SwiftUI and MVVM design pattern
我正在努力思考如何使用带有 SwiftUI 的 MVVM 设计模式来实现以下目标。
我只想拥有 1 个网络操作队列实例(使用 OperationQueue),其中任何需要发送任何网络请求的视图模型,但我听说创建单例不是首选,我应该通过网络在需要的地方排队对象。
因此,如果我在 Scene Delegate 中创建网络操作队列的实例并将它们传递到 ContentView 初始化程序并将其存储在一个对象中,然后传递到随后创建的视图中。
根据我的理解,这似乎不是好的 MVVM 设计实践,View 应该只拥有 ViewModel?
实现此目标的最佳方法是什么?
编辑:对此进行了更多思考,我可以通过它的构造函数将它传递到视图中,然后在构造函数中我可以创建视图模型并直接传递它,这样视图就不会拥有任何东西。
但我仍然需要一个单例,那么如何将单例作为依赖项注入传递而不是全局使用它?
谢谢
我们不应该仅仅因为获取全局变量的简单方法而创建单例,但这并不意味着我们永远不应该使用它们。
就您而言,如果我理解正确的话,您基本上是在创建一个可供整个应用程序使用的服务。您可以 A) 创建一个具有您需要的网络功能的可重用 class(并在您需要的任何地方实例化)或 B)创建一个带有单例实例的 class,可以在任何地方轻松访问.
例如,如果您需要为所有调用者保持一些共同的状态,或者如果您需要维护一个等待队列,那么单例将是更好的选择。
选项 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 中调用的服务。
我正在努力思考如何使用带有 SwiftUI 的 MVVM 设计模式来实现以下目标。
我只想拥有 1 个网络操作队列实例(使用 OperationQueue),其中任何需要发送任何网络请求的视图模型,但我听说创建单例不是首选,我应该通过网络在需要的地方排队对象。
因此,如果我在 Scene Delegate 中创建网络操作队列的实例并将它们传递到 ContentView 初始化程序并将其存储在一个对象中,然后传递到随后创建的视图中。
根据我的理解,这似乎不是好的 MVVM 设计实践,View 应该只拥有 ViewModel?
实现此目标的最佳方法是什么?
编辑:对此进行了更多思考,我可以通过它的构造函数将它传递到视图中,然后在构造函数中我可以创建视图模型并直接传递它,这样视图就不会拥有任何东西。
但我仍然需要一个单例,那么如何将单例作为依赖项注入传递而不是全局使用它?
谢谢
我们不应该仅仅因为获取全局变量的简单方法而创建单例,但这并不意味着我们永远不应该使用它们。
就您而言,如果我理解正确的话,您基本上是在创建一个可供整个应用程序使用的服务。您可以 A) 创建一个具有您需要的网络功能的可重用 class(并在您需要的任何地方实例化)或 B)创建一个带有单例实例的 class,可以在任何地方轻松访问.
例如,如果您需要为所有调用者保持一些共同的状态,或者如果您需要维护一个等待队列,那么单例将是更好的选择。
选项 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 中调用的服务。