0

Fernando Ceja のクリーン アーキテクチャを使用して Android アプリを開発しています。私のインタラクターまたはユース ケースの 1 つが、ユーザーのフィード データの取得を担当しています。データを取得するには、まずデータベース テーブルからユーザーのチームを取得し、次にサーバー側からフィード リストを取得する必要があります。

これは、データベース レイヤーからチームを取得する方法です。

    mTeamCache.getAllTeams().subscribe(new DefaultSubscriber<List<SimpleTeam>>() {
        @Override
        public void onNext(List<SimpleTeam> simpleTeams) {
            super.onNext(simpleTeams);
            mTeams = simpleTeams;
        }
    });

TeamCache は基本的に、データベースにあるすべてのチームを取得する別の Interactor です。

サーバー側からフィード データを取得する方法は次のとおりです。

    mFeedRepository.getFeed(0, 50).subscribe(new ServerSubscriber<List<ApiFeedResponse>>() {
        @Override
        protected void onServerSideError(Throwable errorResponse) {
            callback.onFeedFetchFailed(...);
        }

        @Override
        protected void onSuccess(List<ApiFeedResponse> responseBody) {
            //Do stuff with mTeams
            callback.onFeedFetched(...);
        }
    });

私の GetFeedInteractor クラスには execute と呼ばれるメソッドがあり、後で応答を処理するために UI で使用する Callback を渡します。これらすべての問題は、現在、次のように応答を連鎖させていることです。

@Override
public void execute(final Callback callback, String userSipId) {
    mTeamCache.getAllTeams().subscribe(new DefaultSubscriber<List<SimpleTeam>>() {
        @Override
        public void onNext(List<SimpleTeam> simpleTeams) {
            super.onNext(simpleTeams);
            mTeams = simpleTeams;
            getFeedFromRepository(callback);
        }
    });
}

public void getFeedFromRepository(final Callback callback) {
    mFeedRepository.getFeedRx(0, 50).subscribe(new ServerSubscriber<List<ApiFeedResponse>>() {
        @Override
        protected void onServerSideError(Throwable errorResponse) {
            callback.onFeedFetchFailed("failed");
        }

        @Override
        protected void onSuccess(List<ApiFeedResponse> responseBody) {
            //Do stuff with mTeams
            List<BaseFeedItem> responseList = new ArrayList();

            for (ApiFeedResponse apiFeedResponse : responseBody) {
                responseList.add(FeedDataMapper.transform(apiFeedResponse));
            }

            callback.onFeedFetched(responseList);
        }
    });
}

ご覧のとおり、Cache Interactor から Team コレクションを取得したら、まったく同じ Subscriber からフィードを取得するメソッドを呼び出します。私はこれが好きではありません。Observable.concat(getTeamsFromCache(), getFeedFromRepository()); を使用するなど、より良いことができるようにしたいと考えています。サブスクライバー内の別の rx.Observable への呼び出しをチェーンすることは、良いことではありません。私の質問は、異なるサブスクライバーを使用している 2 つの rx.Observables をチェーンするにはどうすればよいですか?

アップデート:

ServerSubscriber は、Retrofit サービスにサブスクライブするために実装したサブスクライバーです。エラーコードなどをチェックするだけです。ここは:

https://gist.github.com/4gus71n/65dc94de4ca01fb221a079b68c0570b5

デフォルト サブスクライバは、空のデフォルト サブスクライバです。ここは:

https://gist.github.com/4gus71n/df501928fc5d24c2c6ed7740a6520330

TeamCache#getAllTeams() は rx.Observable を返します> FeedRepository#getFeed(int page, int offset) は rx.Observable を返します>

更新 2:

ユーザーのフィードを取得するインタラクターは次のようになります。

@Override
    public void execute(final Callback callback, int offset, int pageSize) {
        User user = mGetLoggedUser.get();
        String userSipid = mUserSipid.get();

        mFeedRepository.getFeed(offset, pageSize) //Get items from the server-side
                .onErrorResumeNext(mFeedCache.getFeed(userSipid)) //If something goes wrong take it from cache
                .mergeWith(mPendingPostCache.getAllPendingPostsAsFeedItems(user)) //Merge the response with the pending posts
                .subscribe(new DefaultSubscriber<List<BaseFeedItem>>() {
                    @Override
                    public void onNext(List<BaseFeedItem> baseFeedItems) {
                        callback.onFeedFetched(baseFeedItems);
                    }

                    @Override
                    public void onError(Throwable e) {
                        if (e instanceof ServerSideException) {
                            //Handle the http error
                        } else if (e instanceof DBException) {
                            //Handle the database cache error
                        } else {
                            //Handle generic error
                        }
                    }
                });
    }
4

1 に答える 1