Недавно я начал проект Android с жестким использованием реактивных расширений. Я прочитал некоторые введения и учебные пособия, но я все еще на уровне новичка. Согласно этой статье:
все это поток
однако мое текущее понимание (или ментальный барьер) говорит мне, что любая операция, которая изменяет состояние (например, удаление данных из репозитория), не должна быть/возвращать поток/наблюдаемый.
Небольшие сведения о моем домене: у меня есть пример использования для регистрации геозон. Поскольку геозоны не выдерживают перезагрузки, я отслеживать активные геозоны в репозитории. Иногда приложению необходимо удалить геозону, поэтому основные шаги для этого:
- получить геозону из репозитория
- удалить геозону с устройства
- удалить геозону из репозитория
мое текущее решение следующее:
geofenceRepository.get(id)
.map(new Func1<Geofence, String>() {
@Override
public String call(Geofence geofence) {
geofenceRepository.delete(geofence.getId()); // synchronous call here
return geofence.getRequestId();
}
})
.toList()
.flatMap(new Func1<List<String>, Observable<Status>>() {
@Override
public Observable<Status> call(List<String> ids) {
return locationProvider.removeGeofences(ids);
}
});
где Geofence — это моя пользовательская структура данных, а locationProvider — из этой замечательной библиотеки.
Вы заметите, что извлечение данных реализовано как потоковое/наблюдаемое, в отличие от удаления.
Что мне не нравится в приведенном выше примере: оператор карты с побочным эффектом
Вопросы
- Что было бы лучшим решением, чтобы быть более «реактивным», чего мне здесь не хватает?
- Есть ли смысл вообще использовать реактивный подход?
реактивное программирование I иметь в виду:
программирование с асинхронными потоками данных