База данных комнат Android RxJava запросы цепочки плоских карт - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь получить пару:

Pair<User,List<Messages>>

Я прочитал эту статью: Шаблоны RxJava

Я в основном пытаюсь получить пользователя первым.Затем, когда у меня есть пользователь, я хочу получить все сообщения этого пользователя:

mDisposable.add(
                userViewModel.getUser(id)
                .flatMap(user -> messagesViewModel.getFromUser(user.getId()),(user, messages) -> new Pair<>(user, messages)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(//update view based on user and messages);

Код не работает, он жалуется на параметры, передаваемые в flatmap.

  • userViewModel.getUser(id) возвращает Single<User>
  • messagesViewModel.getFromUser(user.getId()) возвращает Single<List<Message>>

Документация rx и определение метода для flatmap очень запутаны.Как мне этого добиться?Или есть другой способ сделать это?

Интересно, что он работает с Observable:

mDisposable.add(
                Observable.just(1)
                .flatMap(item -> Observable.just(2), Pair::new)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe());

1 Ответ

0 голосов
/ 17 ноября 2018

Согласно документации, Observable имеет flatMap() функцию с такой подписью, как

public final <U,R> Observable<R> flatMap(Function<? super T,? extends ObservableSource<? extends U>> mapper,
    BiFunction<? super T,? super U,? extends R> resultSelector)

, это именно то, что вы используете в последнем случае.Но Single имеет только flatMap() с такой подписью, как

public final <R> Single<R> flatMap(Function<? super T,? extends SingleSource<? extends R>> mapper)

, поэтому вы не можете использовать его по своему усмотрению.Если вы все еще хотите использовать Single и решить проблему, вы можете использовать следующее выражение

userViewModel.getUser(id)
    .flatMap(user -> messagesViewModel.getFromUser(user.getId())
                             .map(messages -> new Pair<>(user, messages)))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
...