создать один поток списка наблюдаемых Rxjava 2

У меня есть список идентификаторов и метод, который принимает идентификатор и возвращает Observable<Boolean>, он выполняет операцию с использованием идентификатора и возвращает true в случае успеха.

скажем, у меня есть идентификатор пользователя (1), и мне нужно обновить его профиль с помощью этого метода Observable<Boolean> updateProfile(int id) , это нормально и работает нормально.

сейчас мне нужно создать метод для нескольких идентификаторов, и если все профили обновлены, верните true. у него может быть эта подпись Observable<Boolean> updateAllProfiles(int[] ids)

Как добиться чего-то подобного?


person Mohamed Ibrahim    schedule 21.05.2017    source источник


Ответы (1)


Предполагая, что вы хотите обновить каждый профиль отдельно и вернуть true после завершения всех обновлений, вы можете использовать комбинацию flatMap и reduce:

Observable<Boolean> updateAllProfiles(Integer[] ids) {
    return Observable.from(ids)
            .flatMap(id -> updateProfile(id))
            .reduce((prevResult, currResult) -> prevResult && currResult);
}

и использование:

updateAllProfiles(new Integer[]{0, 1, 2, 3, 4})
            .subscribe(updateAllSucceed -> { //do something with result});

это будет запускать все обновления параллельно (при условии, что каждый профиль обновления будет действовать на Scheduler.io или аналогичном, что создает новый поток) и будет накапливать все индикации результатов и возвращать true/false соответственно.
Кстати, вы можете рассмотреть Completable вместо Observable<Boolean> который хорошо подходит для «недействительных» методов обновления (вы можете прочитать мое объяснение здесь)

person yosriz    schedule 21.05.2017