SlideShare a Scribd company logo
1 of 25
Download to read offline
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»
Segue
Placeholder View ControllerView Controller A
View Controller B
Rambler Segues / Embed Segue
View Controller A
Embed Segue
View Controller B
ModuleB
Container
Вызывается через PerformSegue
Контейнер запрашивается по ID Segue
Ссылки на библиотеки:
https://github.com/rambler-ios/ViperMcFlurry.git
https://github.com/rambler-ios/RamblerSegues.git
Спасибо

More Related Content

What's hot

What's hot (8)

Rambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPERRambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPER
 
Rambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOSRambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOS
 
Rambler.iOS #5: TDD и VIPER
Rambler.iOS #5: TDD и VIPERRambler.iOS #5: TDD и VIPER
Rambler.iOS #5: TDD и VIPER
 
Rambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la RamblerRambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la Rambler
 
#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах
 
Angular 2 vs Angular 1
Angular 2 vs Angular 1Angular 2 vs Angular 1
Angular 2 vs Angular 1
 
#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников
 
MSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложностиMSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложности
 

Viewers also liked

Viewers also liked (11)

Break the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER ModulesBreak the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER Modules
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
 
Coding like a sex
Coding like a sexCoding like a sex
Coding like a sex
 
Rambler.iOS #6: Pagination Demystified
Rambler.iOS #6: Pagination DemystifiedRambler.iOS #6: Pagination Demystified
Rambler.iOS #6: Pagination Demystified
 
Rambler.iOS #5: Разбираем Massive View Controller
Rambler.iOS #5: Разбираем Massive View ControllerRambler.iOS #5: Разбираем Massive View Controller
Rambler.iOS #5: Разбираем Massive View Controller
 
Rambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектураRambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектура
 
RDSDataSource: YapDatabase
RDSDataSource: YapDatabaseRDSDataSource: YapDatabase
RDSDataSource: YapDatabase
 
iOS viper presentation
iOS viper presentationiOS viper presentation
iOS viper presentation
 
рентабельный код
рентабельный кодрентабельный код
рентабельный код
 
From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
 

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

Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
Andrew Mayorov
 
Ridgeline 4 Presentation
Ridgeline 4 PresentationRidgeline 4 Presentation
Ridgeline 4 Presentation
MUK
 
UAFPUG6 - PureMVC
UAFPUG6 - PureMVCUAFPUG6 - PureMVC
UAFPUG6 - PureMVC
mandrew182
 
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha DmitryUafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Max Rozdobudko
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Andrey Listochkin
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
Technopark
 

Similar to Rambler.iOS #5: Переходы и передача данных между VIPER модулями (20)

Viper
ViperViper
Viper
 
VIPER architecture
VIPER architectureVIPER architecture
VIPER architecture
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в android
 
Viper в ios проектах
Viper в ios проектахViper в ios проектах
Viper в ios проектах
 
ASP.NET MVC 3
ASP.NET MVC 3ASP.NET MVC 3
ASP.NET MVC 3
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Ridgeline 4 Presentation
Ridgeline 4 PresentationRidgeline 4 Presentation
Ridgeline 4 Presentation
 
UAFPUG6 - PureMVC
UAFPUG6 - PureMVCUAFPUG6 - PureMVC
UAFPUG6 - PureMVC
 
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha DmitryUafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
 
PureMVC and Papervision
PureMVC and PapervisionPureMVC and Papervision
PureMVC and Papervision
 
Mate framework
Mate frameworkMate framework
Mate framework
 
Enterprise flex pure mvc.v4
Enterprise flex pure mvc.v4Enterprise flex pure mvc.v4
Enterprise flex pure mvc.v4
 
Деплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложенийДеплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложений
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных систем
 
Паттерны проектирования
Паттерны проектированияПаттерны проектирования
Паттерны проектирования
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
 
MWWM
MWWMMWWM
MWWM
 
Backbone lesson 1
Backbone lesson 1Backbone lesson 1
Backbone lesson 1
 

More from RAMBLER&Co

More from RAMBLER&Co (20)

RDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRDSDataSource: Основы LLVM
RDSDataSource: Основы LLVM
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
 
Rambler.iOS #9: Life with out of memory
Rambler.iOS #9: Life with out of memoryRambler.iOS #9: Life with out of memory
Rambler.iOS #9: Life with out of memory
 
RDSDataSource: OCLint
RDSDataSource: OCLintRDSDataSource: OCLint
RDSDataSource: OCLint
 
RDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграммRDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграмм
 
RDSDataSource: App Thinning
RDSDataSource: App ThinningRDSDataSource: App Thinning
RDSDataSource: App Thinning
 
RDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по Dip
 
Rambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCoreRambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCore
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеров
 
RDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperiencedRDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperienced
 
RDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDKRDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDK
 
RDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOSRDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOS
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
RDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwiftRDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwift
 
Rambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейса
 
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложенииRambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
 
Rambler.iOS #7: Интернет-эквайринг 101
Rambler.iOS #7: Интернет-эквайринг 101Rambler.iOS #7: Интернет-эквайринг 101
Rambler.iOS #7: Интернет-эквайринг 101
 
Rambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуйRambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуй
 
Rambler.iOS #6: Не рычите на pbxproj
Rambler.iOS #6: Не рычите на pbxprojRambler.iOS #6: Не рычите на pbxproj
Rambler.iOS #6: Не рычите на pbxproj
 

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