Functional
Reactive
Programming
Асинхронность это сложно
Асинхронность это сложно
[task1 setCompleted:^(id result1){
[task2 setCompleted:^(id result2){
[task3 setCompleted^(id result3){
[task4 setCompleted:^(id result4){
[task5 setCompleted:^(id result5){
//Сделать что-то с result5
NSLog(@"Ура! %@", result5);
}]; [task5 start];
}]; [task4 start];
}]; [task3 start];
}]; [task2 start];
}]; [task1 start];
Callback Hell
Асинхронность
это сложно
волюция backendов
DBApp
волюция backendов
DB
API
Storage
Cache
App
App
• Данные с сервера
• Данные с сервера
• Геолокация
• Данные с сервера
• Геолокация
• IO
• Данные с сервера
• Геолокация
• IO
• CPU tasks
• Данные с сервера
• Геолокация
• IO
• CPU tasks
• Пользовательский ввод
Решения?
• mutex, semaphore, etc
Решения?
• mutex, semaphore, etc
• green threads
Решения?
• mutex, semaphore, etc
• green threads
• Future/Promise
Решения?
• mutex, semaphore, etc
• green threads
• Future/Promise
• Stream? WTF?
Поток
• набор значений одного типа во времени
• завершение с ошибкой или успехом
• может не иметь значений
Поток
• ps aux | grep firefox | awk '{print $2}'
• сетевые соединения
• звук и видео
• запросы и ответы сервера
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
@“He”
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
@“He”
@“Hel”
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
@“He”
@“Hel”
@“Hell”
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
@“He”
@“Hel”
@“Hell”
@“Hello”
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
Кнопка как поток
Button
UIControlEventTouchDown
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
UIControlEventTouchDragExit
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
UIControlEventTouchDragExit
UIControlEventTouchDragOutside
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
UIControlEventTouchDragExit
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
UIControlEventTouchDragExit
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter
UIControlEventTouchUpInside
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Binding
• В четыре раза лучше коллбэков
• В два раза лучше промисов
• Способствуют локальности кода
• Упрощают обработку ошибок в цепочках
• Избавляют от Callback Hell
• Прозрачность кода
• Единообразие в работе с разными сущностями
• Простота асинхронного программирования
• Описание “что” надо сделать, вместо “как”
Цена
• Память/производительность
• Трудно построчно отлаживать
• Большой стек вызовов
• Нет готовых специалистов
Ссылки
• Reactive Manifesto
• RxJS
• Соловьёв о FRP+ClojureScript
• Haskell
• lmgtfy
Вопросы?
Сергей Буглаков
@ReDetection
XIAG AG

Functional Reactive Programming