Наблюдаемый отIterable просто вернуть один элемент - PullRequest
0 голосов
/ 08 февраля 2019

Мой observable.fromIterable просто возвращается 1 раз.

Я пытаюсь вернуть список элементов, подобных наблюдаемым объектам.Для этого я использую "fromIterable".topMoviesRated.getResults () возвращает 20 объектов, doOnNext вызывается 20 раз, но метод getResultFromNetwork просто возвращает первый элемент.

Presenter:

public void loadData(boolean error) {
    subscription = model.result(error)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeWith(new DisposableObserver<MyFilm>() {
        @Override
        public void onNext(MyFilm object) {
            if(view!=null){
                view.updateData(object);
            }
        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
            if(view!=null){
                view.showSnackbar("Error...");
            }
        }

        @Override
        public void onComplete() {
            if(view!=null){
                view.showSnackbar("Finished...");
            }
        }
    });
}

Модель:

public Observable<MyFilm> result(boolean error) {
    if (error)
        repository.setPagination(1);
    else
        repository.setPagination(++pagination);

    return Observable.zip(repository.getResultFromNetwork(), detailResult(),  new BiFunction<Result, Details, MyFilm>() {
                @Override
                public MyFilm apply(Result result, Details details) {
                    return new MyFilm(result.getOriginalName(), result.getId().toString(), details);
                }
            });
}

public Observable<Details> detailResult() {
    return Observable.zip(repository.getDetailsData(), repository.getCountryData(), new BiFunction<TVDetails, String, Details>() {
        @Override
        public Details apply(TVDetails tvDetails, String country) {
            return new Details(tvDetails, country);
        }
    });
}

Хранилище:

public Observable<Result> getResultFromNetwork() {
    Observable<TopMoviesRated> topMoviesRatedObservable = moviesApiService.getTopMovies("es_ES", pagination);
    return topMoviesRatedObservable.concatMap(new Function<TopMoviesRated, Observable<Result>>() {
        @Override
        public Observable<Result> apply(TopMoviesRated topMoviesRated) {
            return Observable.fromIterable(topMoviesRated.getResults());
        }
    }).doOnNext(new Consumer<Result>() { 
        @Override
        public void accept(Result result) {
            Log.d("OnNext -->", result.toString());
        }
    });
}

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Ямко прав, zip не то, что вам нужно.Попробуйте использовать Observable.combineLatest вместо него

0 голосов
/ 08 февраля 2019

Проверьте это изображение.В первом списке 5 элементов, а во втором только 4. Как видите, результат оператора zip содержит только 4 элемента. zip operator

...