Как выполнить завершаемую, а затем вернуть обработанный результат синглом? - PullRequest
0 голосов
/ 13 сентября 2018

Надеюсь, мой вопрос достаточно ясен.

Допустим, у вас есть API, который выполняет запросы по сети, поддерживаемой IO-потоками (ввод и вывод).

Используя RxJava (с которой я дебютирую), я думаю, что можно сделать следующее:

public Single<MyData> getMyDataFromApi() {

    return requestMyData()
           .map/flat/then()->waitAndprocessData() // here is the missing link for me. What can I use ?
           .andThen()->returnData()

Как вы поймете, метод requestMyData возвращает Completable, который несет исключительную ответственность и выполняет только одну задачу - выполнить указанный запрос (операция типа IO).

Затем, после выполнения запроса, удаленный объект должен обработать его и вернуть результат запрошенному объекту MyData, выполнив также операцию типа IO.

Ключевым моментом здесь является то, что я работаю с потоками (входными и выходными), операции чтения и записи которых, очевидно, выполняются в отдельных потоках ввода-вывода (с использованием Schedulers.io()).

Итак, в конце концов, есть ли способ, чтобы мой getMyDataFromApi() метод делал следующее:

  1. Выполнить запрос -> это completable
  2. Ждать результата -> что-то вроде подписки? но без расщепления цепи
  3. Обработка результата -> это single или может быть лямбадой в map методе
  4. Вернуть результат -> последний элемент, очевидно, single

В заключение я твердо верю, что подпись requestMyData должна быть подписью Single, потому что она является геттером, и я ожидаю результата или ошибки.

1 Ответ

0 голосов
/ 01 октября 2018

Без реализации методов довольно сложно понять реальную проблему.Если requestMyData возвращает Completable и waitAndprocessData a Single, вы можете сделать следующее:

return requestMyData().andThen(waitAndprocessData());

В любом случае помните, что Completable - это вычисление без какого-либо значения, а только индикация для завершения(или исключения).

...