I try to introduce VIP architecture to my project and do not fully understand the examples that I find, I follow this info https://www.netguru.com/blog/clean-swift-ios-architecture-pattern, and examine the source code inside I am confused about the idea behind, this is the reusable idea of a creating this component or one of the way how to build this component? Example:
// Scene Factory
protocol SceneFactory {
var configurator: LoginSceneConfigurator! { get set }
func makeLoginScene() -> UIViewController
}
final class DefaultSceneFactory: SceneFactory {
var configurator: LoginSceneConfigurator!
func makeLoginScene() -> UIViewController {
let vc = LoginSceneViewController()
return configurator.configured(vc)
}
// Configurator
protocol LoginSceneConfigurator {
func configured(_ vc: LoginSceneViewController) -> LoginSceneViewController
}
final class DefaultLoginSceneConfigurator: LoginSceneConfigurator {
private var sceneFactory: SceneFactory
init(sceneFactory: SceneFactory) {
self.sceneFactory = sceneFactory
}
@discardableResult
func configured(_ vc: LoginSceneViewController) -> LoginSceneViewController {
sceneFactory.configurator = self
let service = DefaultAuthService(
networkManager: DefaultNetworkManager(session: MockNetworkSession())
)
let authWorker = LoginSceneAuthWorker(service: service)
let interactor = LoginSceneInteractor()
let presenter = LoginScenePresenter()
let router = LoginSceneRouter(sceneFactory: sceneFactory)
router.source = vc
presenter.viewController = vc
interactor.presenter = presenter
interactor.authWorker = authWorker
vc.interactor = interactor
vc.router = router
return vc
}
}
In my case, I use a simple little construction and don't know if this is the correct way or not, when I copy the idea and try to implement it in my project, this does not work. I have also attached the source code of my project on google https://drive.google.com/file/d/1DcTxDXNl8idp2C3HLs5ggixdRVTE1UGY/view?usp=sharing My example:
protocol HomeViewProtocol {
func reloadView(_ bucketLists: [TestData])
func showSearchResult(result: String)
func progressState()
}
extension HomeViewController: HomeViewProtocol {
func progressState() {
views?.loader.startAnimating()
}
func showSearchResult(result: String) {
router?.showSearchMsg(result)
views?.loader.stopAnimating()
}
func reloadView(_ bucketLists: [TestData]) {
self.bucketLists = bucketLists
views?.label.text = bucketLists.last?.title
}
}
class HomeViewController: UIViewController {
private var bucketLists: [TestData] = []
var interactor: HomeInteractorProtocol?
var router: HomeViewControllerRouter?
var views: HomeViewContollerViews?
override func viewDidLoad() {
super.viewDidLoad()
configurator()
views?.setupUI()
views?.setupConstraint()
views?.setupNavigationControllerElemenst()
}
private func configurator() {
let searchWorker: HomeViewControllerSearchWorkerProtocol = HomeViewControllerSearchWorker()
var presenter: HomePresenterProtocol = HomePresenter()
presenter.viewController = self
interactor = HomeInteractor()
interactor?.presenter = presenter
interactor?.searchWorker = searchWorker
router = HomeViewControllerRouter()
router?.source = self
views = HomeViewContollerViews()
views?.source = self
}
}