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

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

Embed Size (px)

Citation preview

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

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

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

Автор

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

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

Rambler&Co

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

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

Подход MutualMobile

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

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

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

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

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

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

Interactor

View Controller

Presenter

Wireframe Interactor

View Controller

Presenter

Wireframe

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

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

Interactor

View Controller

Presenter

Wireframe Interactor

View Controller

Presenter

Wireframe

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

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

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

Module A Assembly

Router

View Controller

Presenter

Interactor

View Controller

Presenter

Interactor

Segue

Module B Assembly

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

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

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

AModuleRouter.m

AModuleViewController.m

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

Router

View Controller

Presenter

Interactor

View Controller

Presenter

Interactor

Segue

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

Путь данных

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

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

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

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

AModuleRouter.m

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

Router

View Controller

Presenter

Interactor

View Controller

Presenter

Interactor

Segue

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

Путь данных

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

Router

Interactor

Segue

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

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

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

<TransitionHandler>

Router

Interactor

Segue

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

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

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

<ModuleConfigurator>

<TransitionHandler>

Router

Interactor

Segue

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

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

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

<ModuleConfigurationHolder>

<ModuleConfigurator>

<TransitionHandler>

Router

Interactor

Segue

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

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

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

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

AModuleRouter.m

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

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

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

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

ModuleInput

ConfigurationHolder View Controller B

TransitionHandler View Controller A

ModuleConfigurator Presenter B

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

ModuleOutput Presenter A

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

<ModuleConfigurationHolder>

<ModuleConfigurator>

<TransitionHandler>

Router

Interactor

Segue

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

Путь данных

Presenter

View Controller

Presenter

Interactor

View Controller

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

<TransitionHandler>

<ModuleBInput>

<TransitionHandler>

Router

Interactor

Segue

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

Presenter

View Controller

Presenter

Interactor

View Controller

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

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

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

AModuleRouter.m

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

Viper Mc Flurry

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

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

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

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

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

Данные из Presenter в Presenter

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

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

Rambler Segues / Cross Storyboard Segue

Storyboard A

Storyboard B

RestorationID: «StoryboardB@ViewControllerB»

SeguePlaceholder View ControllerView Controller A

View Controller B

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

Rambler Segues / Embed Segue

View Controller A

Embed SegueView Controller B

ModuleB Container

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

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

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

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

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

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

Спасибо