SlideShare a Scribd company logo
1 of 19
Download to read offline
Реактивный VIPER
Дмитрий Котенко, «Туту.ру»
Реактивный VIPER
Дмитрий Котенко, «Туту.ру»
1
VIPER
Interactor Presenter View
Router
Показывает информацию
пользователю
и переадресует презентеру
действия пользователя
Управляет
вью-контроллером
Общается с сервером
и базой данных
Отвечает за переходы
между экранами
Entity
Entity
Entity
2
Обычный VIPER
Interactor Presenter View
Router
Entity
Entity
Entity
InteractorInput
InteractorOutput
ViewInputViewOutput
RouterInput
· output· output · view
· interactor
3
Презентер и вью
Presenter View
ViewInputViewOutput
· output· view
var button: UIButtonfunc onButtonTapped() {
interactor.loadNews()
} var output: NewsViewOutput!
@IBAction func buttonTapped() {
output.onButtonTapped()
}
func setNews(news: [String]) {
label.text = news.joined(“n”)
}
var view: NewsViewInput!
func newsLoaded(_ news: [String]) {
view.setNews(news)
}
4
Обычный VIPER
Interactor Presenter View
Router
Entity
Entity
Entity
InteractorInput
InteractorOutput
ViewInputViewOutput
RouterInput
· output· output · view
· interactor
5
Сигналы
Текст, набираемый в текстовом поле.
Положение курсора мыши
Значения ячеек в таблице
6
Сигналы в RxSwift
var scrollPosition: Observable<CGPoint> = ...
scrollPosition.subscribe(onNext: { point in
print("User scrolled to (point).")
})
7
Плюсы сигналов
var tableView: UITableView
1. Скролл-вью не знает ни про каких делегатов.
2. Никаких протоколов.
3. Сигнал можно переиспользовать
в нескольких местах.
tableView.delegate = self
extension OffersViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
processScrolling(scrollView.offset)
}
}
let scrollPosition = tableView.rx.contentOffset
scrollPosition.subscribe(onNext: { offset in
self.processScrolling(offset)
})
8
Реактивный ViewOutput
View
ViewInput
Presenter
InteractorOutput
· view
· interactor
ViewOutput
· output
func onButtonTapped() {
interactor.loadNews()
state = .loading
}
var output: NewsViewOutput!
@IBAction func buttonTapped() {
output.onButtonTapped()
}
var buttonTapped: Observable<Void> {
return button.rx.tap.asObservable()
}
view.buttonTapped
.subscribe(onNext: {
interactor.loadNews()
state = .loading
})
9
Реактивный ViewInput
View
ViewInput
Presenter
InteractorOutput ViewOutput
· view
· interactor
protocol NewsViewInput {
var state: PublishSubject<State> { get }
}
ViewModel
10
Реактивный вью
View
ViewInput
ViewOutput
Presenter
InteractorOutput
· view
· interactor
ViewProtocolprotocol NewsViewProtocol {
var state: PublishSubject<State> { get }
var buttonTapped: Observable<Void> { get }
}
1. Меньше протоколов.
2. Вью не привязан к презентеру.
11
Реактивный интерактор
Interactor Presenter View
InteractorInput ViewProtocolInteractorOutput
· output · view
· interactor
InteractorProtocol
1. Ещё меньше протоколов.
2. Вью и интерактор ничего не знают про презентер.
12
Установление связей
Presenter View
ViewProtocol
PresenterProtocol
Interactor
InteractorProtocol
Assembly
view.buttonTapped
.map { [unowned self] in self.date.value }
.bind(to: interactor.loadNews)
.disposed(by: disposeBag)
interactor.newsLoaded
.map { [unowned self] in self.parseLoadingResult($0) }
.bind(to: newsState)
.disposed(by: disposeBag)
viewModel.asObservable()
.bind(to: view!.state)
· view
· interactor
1. Абстрактный презентер с входами и выходами.
2. Одинаковое устройство компонентов.
13
Без протоколов
Presenter ViewInteractor
ViewProtocolPresenterProtocolInteractorProtocol
Assembly
14
Независимые слои
Assembly
ViewInteractor Presenter
Router
15
Независимые слои
View
Interactor
Presenter
Router
View
16
Module
Управление памятью
View
Interactor
Presenter
Router
Связи
class NewsModule {
var interactor: NewsInteractor!
var presenter: NewsPresenter!
var router: NewsRouter!
var moduleDisposeBag: DisposeBag!
}
class NewsViewController {
var module: NewsModule!
}
17
Итог
Interactor Presenter View
Router
Entity
Entity
Entity
RouterInput
InteractorInput
InteractorOutput
ViewInputViewOutput
· output· output · view
· interactor
Демо-приложение: https://github.com/dmitriykotenko/RxViperDemo
1. Независимые компоненты.
2. Гибкая настройка связей.
3. Меньше протоколов.
18

More Related Content

More from CocoaHeads

Александр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыраженияАлександр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыраженияCocoaHeads
 
Николай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслейНиколай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслейCocoaHeads
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутриCocoaHeads
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...CocoaHeads
 
Самвел Меджлумян — S3: API на Swift за пять минут
Самвел Меджлумян —  S3: API на Swift за пять минутСамвел Меджлумян —  S3: API на Swift за пять минут
Самвел Меджлумян — S3: API на Swift за пять минутCocoaHeads
 
Александр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия SwiftАлександр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия SwiftCocoaHeads
 
Катерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестовКатерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестовCocoaHeads
 
Андрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботомАндрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботомCocoaHeads
 
Александр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущегоАлександр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущегоCocoaHeads
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекCocoaHeads
 
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...CocoaHeads
 
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!CocoaHeads
 
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...CocoaHeads
 
Макс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхМакс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхCocoaHeads
 
Михаил Рахманов — Promises, или почему обещания надо выполнять
Михаил Рахманов — Promises, или почему обещания надо выполнятьМихаил Рахманов — Promises, или почему обещания надо выполнять
Михаил Рахманов — Promises, или почему обещания надо выполнятьCocoaHeads
 
Александр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработкиАлександр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработкиCocoaHeads
 
Алина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проектеАлина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проектеCocoaHeads
 

More from CocoaHeads (17)

Александр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыраженияАлександр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыражения
 
Николай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслейНиколай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслей
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
 
Самвел Меджлумян — S3: API на Swift за пять минут
Самвел Меджлумян —  S3: API на Swift за пять минутСамвел Меджлумян —  S3: API на Swift за пять минут
Самвел Меджлумян — S3: API на Swift за пять минут
 
Александр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия SwiftАлександр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия Swift
 
Катерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестовКатерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестов
 
Андрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботомАндрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботом
 
Александр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущегоАлександр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущего
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотек
 
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
 
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
 
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
 
Макс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхМакс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложениях
 
Михаил Рахманов — Promises, или почему обещания надо выполнять
Михаил Рахманов — Promises, или почему обещания надо выполнятьМихаил Рахманов — Promises, или почему обещания надо выполнять
Михаил Рахманов — Promises, или почему обещания надо выполнять
 
Александр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработкиАлександр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработки
 
Алина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проектеАлина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проекте
 

Дмитрий Котенко – Реактивный VIPER