#5: Переходы и передача данных между VIPER модулями

Preview:

Citation preview

VIPERПереходы и передача данных межу модулями

Автор

Зарембо Андрей

Ведущий iOS разработчик

Rambler&Co

Переходы и передача данных между модулями

Подход MutualMobile

Передача данных через Segue

Конфигурация модулей в Router

Передача данных в Presenter

Двусторонняя передача данных и ViperMcFlurry

Путь данных в модуль Путь данных из модуля

Interactor

View Controller

Presenter

Wireframe Interactor

View Controller

Presenter

Wireframe

Переход между модулями

Interactor

View Controller

Presenter

Wireframe Interactor

View Controller

Presenter

Wireframe

Эти зависимости все время находятся в памяти

Возвращение Segues

Module A Assembly

Router

View Controller

Presenter

Interactor

View Controller

Presenter

Interactor

Segue

Module B Assembly

[self.view performSegueWithIdentifier:@"..." sender:data];

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ... bModuleViewController.data = sender ...

AModuleRouter.m

AModuleViewController.m

Router

View Controller

Presenter

Interactor

View Controller

Presenter

Interactor

Segue

Путь данных при использовании Segues

Путь данных

ConfigBlock block = ^(viewControllerB){ ... viewControllerB.data = sender ... } [self.view performSegueWithIdentifier:@"..." sender:block];

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ... ConfigBlock block = (ConfigBlock)sender block(segue.destinationViewController) ...

AModuleRouter.m

ModuleViewController.m

[self.view performSegueWithId:@"..." configurationBlock:^(viewControllerB){ ... viewControllerB.data = sender ... }];

AModuleRouter.m

Router

View Controller

Presenter

Interactor

View Controller

Presenter

Interactor

Segue

Добавляем блок конфигурации в Router

Путь данных

Router

Interactor

Segue

Передача данных сразу в Presenter

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

<TransitionHandler>

Router

Interactor

Segue

Передача данных сразу в Presenter

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

<ModuleConfigurator>

<TransitionHandler>

Router

Interactor

Segue

Передача данных сразу в Presenter

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

<ModuleConfigurationHolder>

<ModuleConfigurator>

<TransitionHandler>

Router

Interactor

Segue

Передача данных сразу в Presenter

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

[[self.transitionHandler initModuleFromSegue:@"..."] thenConfigureWithBlock: ^(id<ModuleBConfigurator> moduleBConfigurator){ … moduleBConfigurator.data = sender … }];

AModuleRouter.m

На освоение библиотеки уходило до 2х дней

Обновляем протоколы

ModuleInput

ConfigurationHolder View Controller B

TransitionHandler View Controller A

ModuleConfigurator Presenter B

Возвращает Presenter как ModuleInput

ModuleOutput Presenter A

<ModuleConfigurationHolder>

<ModuleConfigurator>

<TransitionHandler>

Router

Interactor

Segue

Двусторонняя передача данных в ViperMcFlurry

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

<TransitionHandler>

<ModuleBInput>

<TransitionHandler>

Router

Interactor

Segue

Двусторонняя передача данных в ViperMcFlurry

Presenter

View Controller

Presenter

Interactor

View Controller

Путь данных из модуляПуть данных в модуль

[[self.transitionHandler openModuleUsingSegue:@"…"] thenChainUsingBlock: ^id<ModuleBOutput>(id<ModuleBInput> moduleInput){ … [moduleInput moduleConfigurationMethod]; … return self.moduleBoutput; }];

AModuleRouter.m

Viper Mc Flurry

https://github.com/rambler-ios/ViperMcFlurry.git

Вход и выход у каждого модуля

Переходы целиком в Router

Segue для переходов

Визуальная связь между модулями

Данные из Presenter в Presenter

Работа с MVC-экранами

Rambler Segues / Cross Storyboard Segue

Storyboard A

Storyboard B

RestorationID: «StoryboardB@ViewControllerB»

SeguePlaceholder View ControllerView Controller A

View Controller B

Rambler Segues / Embed Segue

View Controller A

Embed SegueView Controller B

ModuleB Container

Вызывается через PerformSegue

Контейнер запрашивается по ID Segue

Ссылки на библиотеки:

https://github.com/rambler-ios/ViperMcFlurry.git

https://github.com/rambler-ios/RamblerSegues.git

Спасибо

Recommended