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.我该怎么办?
您需要了解ViewModel和协调员的目的,以了解应包含哪些内容.ViewModel的职责是为View准备数据并处理准备该数据的业务逻辑.它将数据绑定到UI元素,并在数据更改后立即更改UI.因此,ViewModel应该是应该包含服务的那个,并且应该从中进行所有调用.
协调员的职责是通过显示包含ViewModel的所有依赖关系的相应ViewController来处理应用程序的导航.因此它还准备ViewModel并在其中注入服务而不使用该服务来操纵数据.
因此,如果我总结一下,协调员应该是准备ViewModel的人,其依赖关系包括注入Web服务,ViewModel应该是使用该服务的人,并且要求从持久性中获取数据.
为了更清楚的想法,您可以在我的Github上检查MVVM-C上的示例应用程序
说到架构,没有灵丹妙药。请记住,MVVM-C 是最干净、最容易测试和模块化的模式之一,因此很高兴您继续使用它。
您可以自由定制架构以满足您的要求。话虽如此,考虑到您当前的设计,我认为最好创建一个 Service 类,并将其称为 WebService。此类将在协调员的监督下执行网络操作。协调员将