Skip to content

Instantly share code, notes, and snippets.

@AlekseyPleshkov
Last active May 8, 2022 13:54
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlekseyPleshkov/0682bd2f977fa6c6046cb172363b753b to your computer and use it in GitHub Desktop.
Save AlekseyPleshkov/0682bd2f977fa6c6046cb172363b753b to your computer and use it in GitHub Desktop.
// Interactor
/// Протокол бизнес логики Interactor'a
protocol HomeBusinessLogic: class {
/// Метод получения данных из сети или других источников
func fetchUser(_ request: HomeModels.FetchUser.Request)
}
final class HomeInteractor: HomeBusinessLogic {
/// Ссылка на логику презентора сцены
var presenter: HomePresentationLogic?
func fetchUser(_ request: HomeModels.FetchUser.Request) {
// Здесь должен быть код получения данных
// Для примера просто создадим константы
let userPhone = "+7 (999) 111-22-33"
let userEmail = "im@alekseypleshkov.ru"
// ...
// Создаем запрос к Presentor'у с необходимыми данными
let response = HomeModels.FetchUser.Response(userPhone: userPhone, userEmail: userEmail)
// Вызываем метод логики презентации у Presentor'а
presenter?.presentUser(response)
}
}
// Models
/// Модель для передачи данных в VIP цикле
enum HomeModels {
/// Набор запросов для одного VIP цикла
enum FetchUser {
/// Запрос к Interactor из View Controller
struct Request {
let userName: String
}
/// Запрос к Presentor из Interactor
struct Response {
let userPhone: String
let userEmail: String
}
/// Запрос к View Controller из Presentor
struct ViewModel {
let userPhone: String
let userEmail: String
}
}
}
// ViewController
/// Протокол логики для отображения подготовленной информации
protocol HomeDisplayLogic: class {
/// Метод логики отображения данных
func displayUser(_ viewModel: HomeModels.FetchUser.ViewModel)
}
final class HomeViewController: UIViewController {
/// Ссылка на протокол бизнес логики Interactor'a сцены
var interactor: HomeBusinessLogic?
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
/// Метод для стартовой настройки компонентов сцены
private func setup() {
// Создаем компоненты VIP цикла
let interactor = HomeInteractor()
let presenter = HomePresenter()
// Связываем созданные компоненты
interactor.presenter = presenter
presenter.viewController = self
// Указываем ссылку на Interactor для View Controller
self.interactor = interactor
}
override func viewDidLoad() {
super.viewDidLoad()
// Запускаем метод подгрузки данных при показе сцены
fetchUser()
}
/// Делаем запрос к Interactor для получения данных
private func loadUserInfromation() {
// Создаем экземпляр запроса к Interactor с параметрами
let request = HomeModels.FetchUser.Request(userName: "Aleksey")
// Вызываем метод бизнес логики у Interactor'a
interactor?.fetchUser(request)
}
}
/// Подписываем контроллер под протокол HomeDisplayLogic
extension HomeViewController: HomeDisplayLogic {
func displayUser(_ viewModel: HomeModels.FetchUser.ViewModel) {
print(viewModel)
}
}
/// Протокол логики презентации
protocol HomePresentationLogic: class {
/// Метод форматирования полученных данных с Interactor'a
func presentUser(_ response: HomeModels.FetchUser.Response)
}
final class HomePresenter: HomePresentationLogic {
/// Ссылка на логику отображения View Controller'a
weak var viewController: HomeDisplayLogic?
func presentUser(_ response: HomeModels.FetchUser.Response) {
// Для примера отформатируем номер телефона
let formattedPhone = response.userPhone.replacingOccurrences(of: "-", with: " ")
// Создаем экземляр ViewModel для отправки в View Controller
let viewModel = HomeModels.FetchUser.ViewModel(userPhone: formattedPhone, userEmail: response.userEmail)
// Вызываем метод логики отображения у View Controller'a
viewController?.displayUser(viewModel)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment