Skip to content
This repository was archived by the owner on Oct 4, 2018. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions Part 1 - Getting Started/2. Key types.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ interface Observer<T> {
```
Эти три метода являются поведением, которое описывает реакцию наблюдателя на сообщение от observable. <b>onNext </b>у наблюдателя будет вызван 0 или более раз, опционально сопровождаясь <b>onCompleted </b>или <b>onError</b>. После них вызовов больше не будет.

Разрабатывая код с помощью Rx, вы увидите много <b>Observable</b>, но намного меньше <b>Observer</b>. И хотя и необходимо понимать концепцию <b>Observer</b>, существуют способы не требующие непосредственного создания его экземпляра.
Разрабатывая код с помощью Rx, вы увидите много <b>Observable</b>, но намного меньше <b>Observer</b>. И хотя и необходимо понимать концепцию <b>Observer</b>, существуют способы, не требующие непосредственного создания его экземпляра.

<h2>Реализация Observable и Observer</h2>
Вы можете вручную реализовать <b>Observer </b>и <b>Observable</b>. В реальности в этом, как правило, нет необходимости: Rx предоставляет готовые решения, чтобы упростить разработку. Это также может быть не совсем безопасно, поскольку взаимодействие между частями библиотеки Rx включает в себя принципы и внутреннюю инфраструктуру, которые могут быть не очевидны новичку. В любом случае, будет проще для начала использовать множество инструментов уже предоставленных библиотекой для создания необходимого нам функционала.
Вы можете вручную реализовать <b>Observer </b>и <b>Observable</b>. В реальности в этом, как правило, нет необходимости: Rx предоставляет готовые решения, чтобы упростить разработку. Это также может быть не совсем безопасно, поскольку взаимодействие между частями библиотеки Rx включает в себя принципы и внутреннюю инфраструктуру, которые могут быть неочевидны новичку. В любом случае, будет проще для начала использовать множество инструментов, уже предоставленных библиотекой для создания необходимого нам функционала.

Чтобы подписаться на observable, совсем нет необходимости в реализации <b>Observer</b>. Существуют другие перегрузки метода <b>subscribe</b>, которые принимают в качестве аргументов соответствующие функции для <b>onNext</b>, <b>onError </b>и <b>onSubscribe</b>, инкапсулирующие создание экземпляра <b>Observer</b>. Предоставлять их всех тоже не обязательно, вы можете описать только часть из них, например, только <b>onNext </b>или только <b>onNext </b>и <b>onError</b>.

Expand Down Expand Up @@ -68,17 +68,17 @@ public static void main(String[] args) {
3
4
```
Как мы видим,<b> 1</b> не была напечатана из-за того, что мы не были подписаны в момент когда она была передана. После того как мы подписались, мы начали получать все значения поступающие в subject.
Как мы видим,<b> 1</b> не была напечатана из-за того, что мы не были подписаны в момент, когда она была передана. После того как мы подписались, мы начали получать все значения, поступающие в subject.

Здесь мы впервые используем метод <b>subscribe</b>, так что стоит уделить этому внимание. В данном случае мы используем перегруженную версию, которая принимает один объект класса <a href="http://reactivex.io/RxJava/javadoc/rx/functions/Function.html">Function</a>, отвечающий за <b>onNext</b>. Эта функция принимает значение типа Integer и ничего не возвращает. Функции, которые ничего не возвращают также называются actions. Мы можем передать эту функцию следующими способами:
Здесь мы впервые используем метод <b>subscribe</b>, так что стоит уделить этому внимание. В данном случае мы используем перегруженную версию, которая принимает один объект класса <a href="http://reactivex.io/RxJava/javadoc/rx/functions/Function.html">Function</a>, отвечающий за <b>onNext</b>. Эта функция принимает значение типа Integer и ничего не возвращает. Функции, которые ничего не возвращают, также называются actions. Мы можем передать эту функцию следующими способами:
<ul>
<li>Предоставить объект класса <b>Action1&#60;Integer&#62;</b></li>
<li>Неявно создать таковой используя <a href="https://en.wikipedia.org/wiki/Anonymous_function#Java">лямбда-выражение</a></li>
<li>Неявно создать таковой, используя <a href="https://en.wikipedia.org/wiki/Anonymous_function#Java">лямбда-выражение</a></li>
<li>Передать ссылку на существующий метод с соответствующей сигнатурой. В данном случае, <b>System.out::println</b> имеет перегруженную версию, которая принимает <b>Object</b>, поэтому мы передаем ссылку на него. Таким образом, подписка позволяет нам печатать в основной поток вывода все поступающие в <b>Subject </b>числа.</li>
</ul>

<h2>ReplaySubject</h2>
<b>ReplaySubject</b> имеет специальную возможность кэшировать все поступившие в него данные. Когда у него появляется новый подписчик, последовательность выдана ему начиная с начала. Все последующие поступившие данные будут выдаваться подписчикам как обычно.
<b>ReplaySubject</b> имеет специальную возможность кэшировать все поступившие в него данные. Когда у него появляется новый подписчик, последовательность выдается ему, начиная с начала. Все последующие поступившие данные будут выдаваться подписчикам как обычно.

```JAVA
ReplaySubject<Integer> s = ReplaySubject.create();
Expand All @@ -97,7 +97,7 @@ Late: 1
Early:2
Late: 2
```
Все значения были получены, не смотря на то, что один из подписчиков подписался позже другого. Обратите внимание, что до того как получить новое значение, подписчик получает все пропущенные. Таким образом, порядок последовательности для подписчика не нарушен.
Все значения были получены, несмотря на то, что один из подписчиков подписался позже другого. Обратите внимание, что до того как получить новое значение, подписчик получает все пропущенные. Таким образом, порядок последовательности для подписчика не нарушен.

Кэшировать всё подряд не всегда лучшая идея, так как последовательности могут быть длинными или даже бесконечными. Фабричный метод <b>ReplaySubject.createWithSize</b> ограничивает размер буфера, а <b>ReplaySubject.createWithTime</b> время, которое объекты будут оставаться в кеше.

Expand Down Expand Up @@ -166,10 +166,10 @@ s.onNext(1);
0
1
```
Так как роль <b>BehaviorSubject </b>– всегда иметь доступные данные, считается неправильным создавать его без начального значения, также как и завершать его.
Так как роль <b>BehaviorSubject </b>– всегда иметь доступные данные, считается неправильным создавать его без начального значения так же, как и завершать его.

<h2>AsyncSubject</h2>
<b>AsyncSubject </b>также хранит последнее значение. Разница в том, что он не выдает данных до тех пока не завершится последовательность. Его используют, когда нужно выдать единое значение и тут же завершиться.
<b>AsyncSubject </b>также хранит последнее значение. Разница в том, что он не выдает данных до тех пор, пока не завершится последовательность. Его используют, когда нужно выдать единое значение и тут же завершиться.

```JAVA
AsyncSubject<Integer> s = AsyncSubject.create();
Expand All @@ -186,7 +186,7 @@ s.onCompleted();
Обратите внимание, что если бы мы не вызвали <b>s.onCompleted()</b>, этот код ничего бы не напечатал.

<h2>Неявная инфраструктура</h2>
Как мы уже упоминали, существуют принципы, которые могут быть не очевидны в коде. Один из важнейших заключается в том, что ни одно событие не будет выдано после того, как последовательность завершена (<b>onError </b>или <b>onCompleted</b>). Реализация <b>subject</b>’ уважает эти принципы:
Как мы уже упоминали, существуют принципы, которые могут быть неочевидны в коде. Один из важнейших заключается в том, что ни одно событие не будет выдано после того, как последовательность завершена (<b>onError </b>или <b>onCompleted</b>). Реализация <b>subject</b>’ уважает эти принципы:

```JAVA
Subject<Integer, Integer> s = ReplaySubject.create();
Expand All @@ -205,7 +205,7 @@ s.onNext(2);
<anchor>notes</anchor>
[1] Или знакомые всем Event Listeners. – <i>Примеч. Автора</i>
[2] Я, все-таки считаю, что ключевой перегрузкой тут является именно версия с Observer в качестве аргумента, в оригинале в качестве примера приводится версия subscribe(Subscriber<? super T> subscriber) – <i>Примеч. Автора</i>
[3] Я буду использовать слово «выдавать» чтобы описать событие передачи данных от Observable Observer’у (to emit в ориг.). – <i>Примеч. Автора</i>
[3] Я буду использовать слово «выдавать», чтобы описать событие передачи данных от Observable Observer’у (to emit в ориг.). – <i>Примеч. Автора</i>
[4] Автор использует термин последовательность (sequence), чтобы обозначить множество всех данных, которые может выдать Observable. – <i>Примеч. Автора</i>

#### Продолжить чтение
Expand Down