RoboSwag/lifecycle-rx/README.md

51 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

lifecycle-rx
=====
Модуль для преобразования событий из `Observable` в `LiveData`. Нужен для передачи событий из `ViewModel` во `ViewController` с автоматическим управлением подписками во `ViewController`.
### Основный интерфейсы и классы
`Destroyable` - интерфейс, который содержит extansion-функцию *untilDestroy* для `Flowable`, `Observable`, `Single`, `Completable`, `Maybe`. Данная функция гарантирует, что подписка на события "умрет" после *onDestroy*.
`LifeDataDispatcher` - интерфейс, описывающий функцию *dispatchTo* для преобразования `Observable` в `MutableLiveData`.
`BaseDestroyable` и `BaseLifeDataDispatcher` - базовые реализации `Destroyable` и `LifeDataDispatcher` соответсвенно.
`RxViewModel` - базовый класс, от которого должны наследоваться все `ViewModel`. Обеспечивает отписку всех подписчиков при возникновении *onCleared*. Реализует `BaseDestroyable` и `LiveDataDispatcher`. По умолчанию использует базовые реализации данных интерфейсов, при желании можно передать свои `Destroyable` и `LiveDataDispatcher` через конструктор.
### Примеры
Простой пример `ViewModel`, через который можно получить список элементов и добавить один элемент.
```kotlin
class SomeViewModel (
private val someRepository: SomeRepository
) : RxViewModel() {
val itemsList = MutableLiveData<ContentEvent<List<Item>>>()
fun getItemsList() {
someRepository
.getItems()
.dispatchTo(itemsList)
}
fun addItem(item: Item) {
someRepository
.addItem(item)
.untilDestroy()
}
}
```
Подписка на события во `ViewController`. `ContentEvent` описан в модуле [lifecycle](https://github.com/TouchInstinct/RoboSwag/tree/master/lifecycle).
```kotlin
someViewModel.itemsList.observe(this, Observer { event ->
when (event) {
is ContentEvent.Loading -> // do something
is ContentEvent.Success -> // do something
is ContentEvent.Error -> // do something
}
})
```