Усильте свои приложения для iOS с помощью реактивного программирования

Вы получаете проект по созданию меню еды для вашего клиента. Это относительно простое приложение, которое показывает время работы, а также блюда и цены.

Затем клиент может покупать еду из приложения. Единственное требование, которое предъявил клиент, — это нужно сделать в RxSwift.

RxSwift имеет крутую кривую обучения, которая может быть сложной для новичков, но вы хотели добиться успеха, поэтому вы пошли дальше и бросили себе вызов.

Первым шагом к использованию RxSwift, конечно же, является их импорт либо через диспетчер пакетов Swift (SPM), либо через Cocoapods. Вы решили пойти по второму пути и вставить следующий код внутрь Podfile

Начиная

pod 'RxSwift'
pod 'RxCocoa'
pod 'RxDataSources'

Вы pod install их, и теперь вы готовы погрузиться в это путешествие RxSwift и никогда не оглядываться назад.

Тип модели

Важно знать, как определить тип модели в RxSwift. Вы знаете, что должен быть рабочий час и еда с ценой. Вы будете использовать enum, учитывая возможность легкого масштабирования. Я имел в виду, что если требования возрастут, вам нужно будет добавить различные разделы, такие как изображение, карта и т. д. Этот подход позволяет вам легко это сделать.

Этот фрагмент кода представляет Section на вашем UITableView. У вас будет один раздел, содержащий часы работы, и другой раздел, содержащий продукты питания с ценой.

enum HomeSectionModel {
    case informationSection(title: String, items: [HomeSectionItem])
    case foodSection(title: String, items: [HomeSectionItem])
}

Далее вам нужно будет создать Row в разделе. Каждый представлен следующим:

enum HomeSectionItem {
    case operatingHourItem(time: String)
    case foodItem(title: String, price: String)
}

Наконец, ваш тип модели всегда должен соответствовать SectionModelType. Это в основном код котла, который вам нужно будет реализовать для инициализации вашей модели.

Создание вашего типа модели

Ваш Тип модели может быть либо жестко запрограммирован, либо ответом от API. Для этого примера это будет просто жестко запрограммированная модель.

Создайте новый класс и назовите его ViewModel.swift; здесь вы создадите свою модель.

Вам нужно будет импортировать следующее:

import RxSwift
import RxCocoa

Вы будете использовать BehaviorSubject для хранения своей модели, но она недоступна ни для одного класса. Вы также создадите еще одну переменную с типом Driver, которая будет доступна через файл ViewController.

Теперь у вас есть все переменные, давайте продолжим и жестко запрограммируем нашу модель в файле ViewModel. Внутри того же файла создайте функцию, которая позволит вам жестко закодировать вашу модель.

Заполните модель

Вернемся к ViewController.swift, здесь у вас будет UITableView и произойдет привязка.

Вам нужно будет импортировать следующее:

import RxDataSources
import RxSwift

Мы будем двигаться один за другим, чтобы создать связанную функцию в viewDidLoad.

Вам нужно будет создать экземпляр ViewModel. Давайте сделаем это следующим образом:

private func configureViewModel() {
   viewModel = ViewModel()
}

Затем вы настроите свою модель.

Вот этот фрагмент кода, где вы устанавливаете ячейки. Если это информационная модель, вы можете вернуть ячейку A. А если это модель еды, вы можете вернуть ячейку B.

Вам понадобится источник данных и модель, чтобы иметь возможность генерировать всю информацию о UITableView.

  1. Здесь вы вручную создаете модель внутри файла ViewModel.
  2. Вы создаете переменную для получения источника данных.
  3. По сути, то, что вы делаете здесь, это то, что с информацией, которую вы получаете от модели, вы хотели бы заполнить ее в следующей ячейке.
  4. Это позволяет вам нажимать на каждую из ячеек, но все, что меня действительно волнует, это то, что если пользователь нажимает на еду, вы показываете предупреждение. Нажатие на информацию ничего не даст, потому что здесь она не обрабатывается.

Наконец, вам нужно будет зарегистрировать TableViewCell для использования. И функция, которая показывает предупреждение.

Вы готовы запустить приложение и показать его своему клиенту.