Подтвердить что ты не робот

Цеповые запросы в "Дооснащение + RxJava"

У меня есть два API-интерфейса, которые я хочу сделать последовательно, и хранить их в SQLite.

Сначала я хочу сделать запрос API A и сохранить его данные в таблице SQL A. Затем выполните запрос API B и сохраните его данные в таблице B и некоторые данные в таблице a_b. Данные, хранящиеся в a_b, принадлежат только запросу B.

Как это сделать, используя RxJava. Я где-то читал об использовании flatMap для этого, что-то вроде этого

apiService.A()
    // store in DB here? How? maybe use map()?
    .flatMap(modelA -> {
        // or maybe store modelA in DB here?
        return apiService.B().map(modelB -> {
            storeInDB()l // store B here ?
            return modelB;
        });
    });

Если бы я не использовал лямбда-функции, это выглядело бы уродливым, как обычные вложенные вызовы. Это лучший способ сделать это?

4b9b3361

Ответ 1

Я не думаю, что использование оператора map - лучший способ пойти с такими вещами, как сохранение результата вызова api.

Что мне нравится делать, так это отделить эти вещи внутри операторов doOnNext. Таким образом, ваш пример будет примерно таким:

apiService.A()
        .doOnNext(modelA -> db.store(modelA))
        .flatMap(modelA -> apiService.B())
        .doOnNext(modelB -> db.store(modelB));

(добавьте необходимые observeOn и subscribeOn себя, точно так, как вам нужно)

Ответ 2

Да, вы можете использовать flatmap для этой конкретной цели. См. Приведенный ниже пример (Предполагая, что ваша служба A возвращает Observable<FooA>, а служба B возвращает Observable<FooB>)

api.serviceA()
        .flatMap(new Func1<FooA, Observable<FooB>>() {
            @Override
            public Observable<FooB> call(FooA fooA) {
                // code to save data from service A to db

                // call service B
                return api.serviceB();
            }
         })
         .subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread())
         .subscribe(new Subscriber<FooB>() {
             @Override
             public void onCompleted() {
             }

             @Override
             public void onError(Throwable e) {

             }

             @Override
             public void onNext(FooB fooB) {
                 // code to save data from service B to db

             }
        });