functional reactive programming
TRANSCRIPT
[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
Поток
• набор значений одного типа во времени
• завершение с ошибкой или успехом
• может не иметь значений
Поток• 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”
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]
• В четыре раза лучше коллбэков • В два раза лучше промисов • Способствуют локальности кода • Упрощают обработку ошибок в цепочках • Избавляют от Callback Hell
• Прозрачность кода • Единообразие в работе с разными сущностями • Простота асинхронного программирования • Описание “что” надо сделать, вместо “как”
Цена• Память/производительность
• Трудно построчно отлаживать
• Большой стек вызовов
• Нет готовых специалистов
Ссылки• Reactive Manifesto
• RxJS
• Соловьёв о FRP+ClojureScript
• Haskell
• lmgtfy