Мы знаем, что ObservableObject
классы с его @Published
свойствами созданы в Combine
специально для View Model
в SwiftUI
. Но в точности ту же самую View Model
можно использовать и в UIKit
для реализации архитектуры MVVM
, хотя в этом случае нам придется вручную «привязать» (bind
) UI
элементы к @Published
свойствам View Model
. Вы удивитесь, но с помощью Combine
это делается парой строк кода. Кроме того, придерживаясь этой идеологии при проектировании UIKit
приложений, вы в дальнейшем безболезненно перейдете на SwiftUI
.
Цель этой статьи состоит в том, чтобы на примитивно простом примере показать, как можно элегантно реализовать MVVM
архитектуру в UIKit
с помощью Combine
. Для контраста покажем использование той же самой View Model
в SwiftUI
.
Мы создадим два простейших приложения, позволяющих выбирать с сайта OpenWeatherMap самую свежую информацию о погоде для определенного города. Но UI
одного из них будет создан с применением SwiftUI
, а другого — с помощью UIKit
. Для пользователя эти приложения будут выглядеть почти одинаковыми. Код находится на Github.
Пользовательский интерфейс (UI
) будет содержать всего 2 UI
элемента: текстовое поле для ввода города и метку для отображения температуры. Текстовое поле для ввода города — это активный ВХОД (Input
), а отображающая температуру метка — пассивный ВЫХОД (Output
).
Роль View Model
в архитектуре MVVM состоит в том, что она берет ВХОД(Ы) с View
(или ViewController
в UIKit
), реализует бизнес-логику приложения и передаёт ВЫХОДЫ назад в View
(или ViewController
в UIKit
), возможно, представляя эти данные в нужном формате.
Создать View Model
с помощью Combine
независимо от того, какая бизнес-логика — синхронная или асинхронная — очень просто, если использовать ObservableObject
класс с его @Published
свойствами.