使用MVVMC架构在iOS应用程序中调用Web服务的最佳位置是什么?

Tha*_*ipe 11 architecture design-patterns mvvm ios

目前我正在使用MVVMC架构开发iOS应用程序.通过阅读本文,我对MVVMC有了一些了解.作为典型的MVVM模型,我们知道所有主要的应用程序控制器(如Web服务调用)都应该在ViewModel类中调用.但是在MVVMC架构中,我们可以使用Coordinator或ViewModel来调用Web服务.我无法弄清楚这是最好的地方.

我目前正在尝试使用UITableViewController实现应用程序的用户列表页面.以下是我的UserCoordinator和UserViewModel类的一些部分.


UserCoordinator

class UsersCoordinator: Coordinator {

var window: UIWindow
weak var delegate: UsersCoordinatorDelegate?

var  selectedCity: City?

init(window: UIWindow) {
    self.window = window
}

func start() {
    let storyboard = UIStoryboard(name: "Users", bundle: nil)
    if let vc = storyboard.instantiateViewController(withIdentifier: "list") as? UsersListController {
        var viewModel = UsersListViewModel()
        viewModel.delegate = self as UsersListViewModelDelegate
        viewModel.veiwController = vc
        vc.viewModel = viewModel
        vc.coordinationDelegate = self as CoordinationDelegate
        let nav = UINavigationController.init(rootViewController: vc)
        window.rootViewController = nav
    }

}
Run Code Online (Sandbox Code Playgroud)

UserViewModel

 protocol UsersListViewModelDelegate: class  {
    func selectUser(viewController: UIViewController, city: City)
}

struct UsersListViewModel {
    var delegate: UsersListViewModelDelegate?
    weak var veiwController: UsersListController!
    var source = [String]()

    init() {
        for user in users {
            source.append(user.name)
        }
    }

    func selectRow(row: NSInteger) {
        delegate?.selectUser(viewController: veiwController, user: users[row])
    }

    fileprivate var users: [User] {
        get {
            //web service call??
        }
Run Code Online (Sandbox Code Playgroud)

我应该在哪里拨打网络服务?正如我从理论上讲,协调器是应用程序路由的专用场所.因此,最好在ViewModel中调用Web服务.但我觉得最好在协调器中调用Web服务,因为它会非常快速地加载数据并填充viewModel.我该怎么办?

osa*_*ama 5

您需要了解ViewModel和协调员的目的,以了解应包含哪些内容.ViewModel的职责是为View准备数据并处理准备该数据的业务逻辑.它将数据绑定到UI元素,并在数据更改后立即更改UI.因此,ViewModel应该是应该包含服务的那个,并且应该从中进行所有调用.

协调员的职责是通过显示包含ViewModel的所有依赖关系的相应ViewController来处理应用程序的导航.因此它还准备ViewModel并在其中注入服务而不使用该服务来操纵数据.

因此,如果我总结一下,协调员应该是准备ViewModel的人,其依赖关系包括注入Web服务,ViewModel应该是使用该服务的人,并且要求从持久性中获取数据.

为了更清楚的想法,您可以在我的Github上检查MVVM-C上的示例应用程序


NSA*_*Adi 2

说到架构,没有灵丹妙药。请记住,MVVM-C 是最干净、最容易测试和模块化的模式之一,因此很高兴您继续使用它。

您可以自由定制架构以满足您的要求。话虽如此,考虑到您当前的设计,我认为最好创建一个 Service 类,并将其称为 WebService。此类将在协调员的监督下执行网络操作。协调员将

  1. 初始化网络服务
  2. 执行网络调用
  3. 使用获取的数据初始化 ViewModel(或指示 ViewModel 处理失败的网络调用)