This repository has been archived by the owner on Jan 20, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRxSwift
96 lines (71 loc) · 5.96 KB
/
RxSwift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
RxSwift
RxCocoa
RxDataSources
RxFeedback
Область применения
В основе Rx лежат потоки событий, на которые отлично ложаться асихронные вычисления и логика основанная на событиях.
Область применения в МП
Обычное мобильное приложение - это графический интервейс между пользователем и бэк-эндом.
Асихронность в МП:
* API бэк-энда (потому что сеть)
* Пользовательский ввод (потому что основан на событиях)
* API ОС типа геолокации и прочего.
* все тяжелое операции, которыми мы не хотим грузить основной поток
В общем куда не сунься, а почти везде всё асинхронное.
Что нам предлагает iOS?
* NSThread
+ полный контроль над происходязщим
- все надо сделать самому
- больший простор для ошибок
* Grand Central Dispatch
+ моделирует очереди с независимыми задачами
+ поддерживает последовательное и параллельное выполнение задач
- не подерживает зависимости между операциями
- нет встроенного механизма для обмена данными между задачами
- нет встроенного механизма обработки ошибок
- одно вычисление - один результат
- код начинает быстро пухнать, как только нужно что-то сложнее, чем подождать одну операцию, или все операции в группе
* NSOperationQueue
+ моделирует очереди зависимых задач
+ поддерживает последовательное и параллельное выполнение задач
+ задачи могут зависить друг от друга
- менеджмент жизненного цикла операции, который заключается в том, что нужно взводить флажки, а так же проверять их состояние
- весьма многословной и не слишком наглядный API для настройки зависимостей
- нет встроенного механизма для передачи данных между задачами
- одно вычисление - один результат
- встроенный механизм обработки ошибок весьма ограничен: завалить зависимые операции, или нет
* NSNotificationCenter
+ по сути это шина
+ хорошо в простых случаях типа fire and forget
- плохо во все остальных
- тяжело разбирать поток управления, потому что тяжело сказать, где что началось и где оно заканчивается
- никакой строгой типизации
* делегаты
* функции обратного вызова
* KVO
- крайне неуклюжий API, который провоцирует на ошибки (под Swift лучше)
- тяжело разбирать поток управления, потому что тяжело сказать, где что началось и где оно заканчивается
Что нам предлагает Rx?
* Observable<T>
+ моделирует поток событий с весьма простых жизненным циклом: [next*] (completed | error)
+ отлично подходят для инкапсуляции асинхроного вычисления
+ может возвращатся серию значений, а не только одно
+ встроенный механизм передачи данных между вычислениями
+ встроенный механизм обработки ошибок
+ лаконичный декларативный API для описания зависимостей между вычислениями
+ встроенный мезанизм отмены вычислений
+ планировщики, которые позволяют раскидать вычисления по очередям
+ различные стратегии по разделению результатов вычислений
+ вычисление может быть чистым, а может и включать побычные эффекты
+ строгая типизация для результатов вычислений (но не для ошибок)
- тяжело въехать
- неопределенности, связанные с жизненным циклом вычисления:
* вычисление может завершиться с ошибкой, а может и нет
* вычисление может вернуть некоторое значение, а может ничего не возвращать и сводиться к побочным эффектам
* какая конкретная стратегия разделения вычислений применена в конкретном случае?
- в общем случае нельзя понять сопровождается ли вычисление побочными эффектами, или нет
- в общем случае нельзя понять на каком потоке происходит вычисления
Rx и функции обратного вызова
См. пример
Rx и NotificationCenter
См. пример