В чем преимущества производительности у MVVM перед MVC в iOS?

«В чем преимущества производительности у MVVM перед MVC в iOS?» — вопрос из категории Архитектура, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MVVM не делает приложение «быстрее» в смысле raw performance, но значительно повышает эффективность разработки и отзывчивость UI, что субъективно воспринимается как скорость. Основные выгоды:

  1. Разгрузка ViewController (Massive View Controller): Бизнес-логика и состояние переносятся в ViewModel, делая VC легковесным и сфокусированным только на управлении view.
  2. Реактивные обновления UI: Использование биндингов (Combine, RxSwift) позволяет UI автоматически обновляться при изменении данных в ViewModel, избегая ручных вызовов и потенциальных ошибок.
  3. Упрощенная асинхронность: ViewModel инкапсулирует асинхронные операции, предоставляя VC простые наблюдаемые свойства.

Пример с Combine:

// ViewModel
class UserViewModel {
    @Published var userName: String = ""
    @Published var isLoading: Bool = false

    func fetchUser() {
        isLoading = true
        NetworkService.fetchUser { [weak self] user in
            self?.isLoading = false
            self?.userName = user.name
        }
    }
}

// ViewController
class UserViewController: UIViewController {
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!

    var viewModel = UserViewModel()
    private var cancellables = Set<AnyCancellable>()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupBindings()
        viewModel.fetchUser()
    }

    private func setupBindings() {
        // Автоматическое обновление UI
        viewModel.$userName
            .assign(to: .text, on: nameLabel)
            .store(in: &cancellables)

        viewModel.$isLoading
            .map { !$0 }
            .assign(to: .isHidden, on: activityIndicator)
            .store(in: &cancellables)
    }
}

Итог: MVVM ускоряет разработку, улучшает тестируемость и делает UI более отзывчивым за счет декларативного стиля.