Я разработчик iOS, и я виноват в том, что у меня есть контроллеры Massive View, поэтому я искал лучший способ структурирования своих проектов и столкнулся с архитектурой MVVM (Model-View-ViewModel). Я читал много MVVM с iOS, и у меня есть пара вопросов. Я объясню свои проблемы на примере.
У меня есть контроллер вида LoginViewController
.
LoginViewController.swift
import UIKit
class LoginViewController: UIViewController {
@IBOutlet private var usernameTextField: UITextField!
@IBOutlet private var passwordTextField: UITextField!
private let loginViewModel = LoginViewModel()
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func loginButtonPressed(sender: UIButton) {
loginViewModel.login()
}
}
У него нет класса Model. Но я создал модель представления под названием LoginViewModel
, чтобы поместить логику проверки и сетевые вызовы.
LoginViewModel.swift
import Foundation
class LoginViewModel {
var username: String?
var password: String?
init(username: String? = nil, password: String? = nil) {
self.username = username
self.password = password
}
func validate() {
if username == nil || password == nil {
// Show the user an alert with the error
}
}
func login() {
// Call the login() method in ApiHandler
let api = ApiHandler()
api.login(username!, password: password!, success: { (data) -> Void in
// Go to the next view controller
}) { (error) -> Void in
// Show the user an alert with the error
}
}
}
-
Мой первый вопрос - это моя реализация MVVM правильно? У меня есть это сомнение, потому что, например, я ввел в контроллер событие нажатия кнопки входа (
loginButtonPressed
). Я не создавал отдельное представление для экрана входа, потому что у него есть только несколько текстовых полей и кнопка. Допустимо ли для контроллера использовать методы событий, привязанные к элементам пользовательского интерфейса? -
Мой следующий вопрос касается кнопки входа в систему. Когда пользователь нажимает кнопку, значения имени пользователя и пароля должны быть переданы в LoginViewModel для проверки и в случае успеха, а затем для вызова API. Мой вопрос, как передать значения модели представления. Должен ли я добавить два параметра в метод
login()
и передать их, когда я вызываю его из контроллера вида? Или я должен объявлять свойства для них в модели представления и устанавливать их значения из контроллера представления? Какой из них допустим в MVVM? -
Возьмите метод
validate()
в модели представления. Пользователь должен быть уведомлен, если любой из них пуст. Это означает, что после проверки результат должен быть возвращен контроллеру представления для принятия необходимых действий (показать предупреждение). То же самое с методомlogin()
. Предупреждать пользователя, если запрос не работает или перейти к следующему контроллеру представления, если он преуспеет. Как я могу уведомить контроллер этих событий из модели представления? Можно ли использовать такие механизмы привязки, как KVO, в таких случаях? -
Каковы другие механизмы привязки при использовании MVVM для iOS? КВО - одно. Но я читал, что он не подходит для крупных проектов, потому что для этого требуется много шаблонов (регистрация/регистрация регистраторов и т.д.). Какие существуют другие варианты? Я знаю, что ReactiveCocoa - это фреймворк, используемый для этого, но я ищу, есть ли другие родные.
Все материалы, которые я наткнулся на MVVM в Интернете, не дали никакой информации об этих деталях, которые я хочу уточнить, поэтому я действительно ценю ваши ответы.