Mes
Mes

Reputation: 1691

How to avoid nested subscription

I have this method deleteFeedTable() which returns a Completable and when it finishes I want to start another Disposable.

What I did is combine the two using operator concatWith, but this results in a nested subscription and I'd like to avoid that.

disposables.add(
                localDataSource.deleteFeedTable()
                        .doOnComplete(() -> {                                preferencesManager.setFeedTableUpdateState(false);
                        })
                        .concatWith(new Completable() {
                            @Override
                            protected void subscribeActual(CompletableObserver s) {   
                             s.onSubscribe(localDataSource.getLastStoredId()
                                        .flatMap(lastStoredId -> remoteDataSource.getFeed(lastStoredId))
                                        .doOnNext(feedItemList -> localDataSource.saveFeed(feedItemList))
                                        .map(feedItemList -> {
                                            Timber.i("MESA STO MAP");
                                            List<Feed> feedList = new ArrayList<>();
                                            for (FeedItem feedItem : feedItemList) {
                                                feedList.add(mapper.from(feedItem));
                                            }
                                            downloadImageUseCase.downloadPhotos(feedList);
                                            return feedList;
                                        })
                                        .subscribe());
                            }
                        })
                        .subscribeOn(schedulerProvider.io())
                        .observeOn(schedulerProvider.mainThread())
                        .subscribe(() -> {}, throwable -> Log.i("THROW", "loadData ", throwable)));

Is there a way I can avoid the nested subscription ? Or is there another way to add it to the disposables variable so I can clear the subscription later ?

Upvotes: 1

Views: 317

Answers (1)

akarnokd
akarnokd

Reputation: 70007

Use andThen:

disposables.add(
    localDataSource.deleteFeedTable()
        .doOnComplete(() -> {
            preferencesManager.setFeedTableUpdateState(false);
        })
        .andThen(
            localDataSource.getLastStoredId()
                .flatMap(lastStoredId -> remoteDataSource.getFeed(lastStoredId))
                .doOnNext(feedItemList -> localDataSource.saveFeed(feedItemList))
                .map(feedItemList -> {
                    Timber.i("MESA STO MAP");
                    List<Feed> feedList = new ArrayList<>();
                    for (FeedItem feedItem : feedItemList) {
                        feedList.add(mapper.from(feedItem));
                    }
                    downloadImageUseCase.downloadPhotos(feedList);
                    return feedList;
                })
        )
        .subscribeOn(schedulerProvider.io())
        .observeOn(schedulerProvider.mainThread())
        .subscribe(() -> {}, throwable -> Log.i("THROW", "loadData ", throwable)));

Upvotes: 4

Related Questions