помогите с архитектурой ios-приложения(MVP)
Архитектура MVP.
Делаю приложение, которое позволяет пройти авторизацию через инстаграм, а затем отобразить некоторую информацию с вашего аккаунта.
я так понимаю, что у меня должна быть одна модель Profile(профиль страницы в инстагрме).
получается, что у меня будет один презентер к ней и один класс ProfileService для загрузки данных.
то есть
struct Profile,
protocol ProfileViewDelegate
class ProfilePresenter {
var pc: ProfileService
var pfd: ProfileViewDelegate
}
class ProfileService
У меня уже есть два экрана: Авторизации и отображения профиля. Допустим у меня еще буду несколько экранов, например, для отображения списка подписчиков. Нужно ли мне для него тоже отдельно делать презентеры и тд? Нужно ли делать презентер для каждого экрана, для экрана авторизации и тд?
Если я неправильно понял, можете подсказать примерную структуру классов.
Ответы (2 шт):
Суть архитектуры MVP в том, что презентер (P) управляет отображением контента (M) на вью (V). Т.е. да, для всех экранов нужен свой презентер.
Вот хорошая статья на тему архитектур:
Если вы хотите в профиле отображать изображения, то вам так же потребуется модель Post.
Протокол для вью(ProfileViewDelegate) делать лучше так:
protocol ProfileViewDelegate: class
И в Presenter сделать weak var pfd: ProfileViewDelegate.
Так же нужно сделать протокол для Presenter. Например ProfileOutput в котором будут находится переменные и методы, которые вы хотите сделать. И во view указать не сам класс презентера, а протокол, от которого он наследуется.
То есть во view надо сделать примерно так:
class ProfileView: ProfileViewDelegate {
var presenter: ProfileOutput!
}
В данном случае можно поставить "!", так как он обязательно должен быть.
Для каждого контроллера должен быть свой презентр и надо разбивать приложение на модули.
Так же для каждого модуля должен быть Assembly/Builder(в разных командах его называют по разному) класс. Он может быть один на весь проект или под каждый модуль отдельно. Так как мы и в presenter, и во view завязываемся на протоколах, то надо сделать инъекцию зависимостей(Dependency injection). То есть сущности должны собираться из вне. Выглядеть он должен примерно так:
class ProfileAssembly {
class func configureModule() -> ProfileViewController {
let view = ProfileViewController()
let presenter = ProfilePresenter()
view.presenter = presenter
presenter.view = view
return view
}
}
Если вы хотите чтобы был один билдер на все приложение, то просто создаете для каждого модуля свой метод, например configureProfileModule, configureFollowersModule() и т.д.
Структура проекта должна быть примерно такой:
|
| ProfileModule
|
| Presentr
|
| ProfilePresenter
|
| View
|
| ProfileViewController
|
| ProfileAssembly
|
|
| Model
|
| Profile
|
| Services
|
| NetworkService
Модель обычно выносится в отдельную директорию в папке проекта, так как она скорее всего будет использоваться по всему приложению. Если же она будет использоваться только в рамках модуля, то можно ее поместить в директорию модуля