Объединение различных источников в RxJava MVVM (FCM, Networking, ROOM) - PullRequest
0 голосов
/ 25 августа 2018

Ранее я использовал MediatorLiveData для объединения результатов из FCM, Room и Networking в моем репозитории. Это сработало хорошо. Тем не менее, теперь я хочу больше сложности и некоторые дополнительные бонусы от RxJava. Вот почему я решил использовать RxJava на этот раз. Я могу объединить Room и Networking с Observable.concatArrayEager (мои _observables). Однако я не знаю, как это сделать после того, как значение FCM подтолкнуло, и как я должен уведомить свою основную наблюдаемую информацию о новых изменениях? Никаких примеров по этому вопросу. Это важная часть. Я получаю FCM в своем BroadCastReceiver, а затем уведомляю данные о жизни моего репозитория, в которых уведомляется мой MediatorLiveData ... Как это сделать с RxJava? Очень хотелось бы получить любой совет, потому что это действительно важный вопрос.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Оператор concat испускает наблюдаемые в указанном порядке, это означает, что вторая наблюдаемая не начнет излучать до тех пор, пока первые наблюдаемые не закончат излучать объекты.

Но с оператором merge Вы можете объединить столько наблюдаемых, сколько хотите, в одну наблюдаемую.например:

Observable.merge(dbObservable, webObservable, fcmObservable)
    .subscribe(item -> System.out.println(item));

PS: Если вы хотите извлечь данные из источника данных и поддерживать их актуальность с помощью fcm, вы можете сделать это:

fcmObservable
        .startWith(dbObservable)
        .subscribe(item -> System.out.println(item));

Это всего лишь несколько доступных шаблонов, как всегда нет ничего невозможного в RxJava, исходя из того, что вы хотите сделать, всегда есть лучший RxChain для работы!

0 голосов
/ 25 августа 2018

ИМХО, вам не нужно объединять данные из разных источников.

Использование базы данных в качестве единственного источника истины определенно проще.

Комната поддерживает Flowable, например:

@Query(“SELECT * FROM Users WHERE id = :userId”)
Flowable<User> getUserById(String userId);

Каждый раз, когда происходит обновление таблицыUsers, Room автоматически выдаст обновленного пользователя после подписки.

Вам может помочь следующий подход:

  1. В вас Activity / Fragment, подпишитесь на Flowable.
  2. Получив уведомление FCM, позвоните в сеть api и обновите базу данных.
  3. Сделайте с обновленными данными.

В любом случае, если вам нужнодля объединения наборов предметов из разных Observables вы можете использовать zip.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...