0

基本的なサンプルから始めましょう。

リポジトリから認証トークンを取得するための次のコード ブロックがあるとします。

private fun getToken(): LiveData<TokenResponse> {
        return LiveDataReactiveStreams.fromPublisher(remoteSource.getAuthToken()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map { token -> token }
        )
    }

ViewModelでLiveDataの結果を受け取っています

class HomeModel {

        private var tokenLiveDataSource: MediatorLiveData<TokenResponse> = MediatorLiveData()
        private var tokenLiveData: MutableLiveData<TokenResponse> = MutableLiveData()

        fun observeTokenLiveData(): LiveData<TokenResponse> {
            return tokenLiveData
        }

        fun getToken() {
            val source = repository.getToken()
            tokenLiveDataSource.addSource(source) {
                tokenLiveData.value = it
                tokenLiveDataSource.removeSource(source)
            }
        }
    }

この時点で、例外としてすべてが完全に機能します。ただし、2つのリクエストをマージして、それぞれに個別のLiveDataを取得したい場合に問題が発生します。Token APIから結果を受け取った後にSearch APIを呼び出したいとしましょう。私の目的は、各ステップで 2 つのLiveDataイベントの変更を取得することです。私の要件を示すために変更されたコードを以下に示します。

private fun getSearchResult(): LiveData<?> {
    return LiveDataReactiveStreams.fromPublisher(remoteSource.getAuthToken() // 1ST API CALL
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .map { token ->
                // NOTIFY THE 1ST API RESULT/RETURN LiveData<TokenResponse>
                token
            }
            .flatMap { token ->
                remoteSource.getSearchResult(token) // 2ND API CALL
            }
            .map { results ->
                // NOTIFY THE 2ND API RESULT/RETURN LiveData<SearchResult>
                results
            }

    )
}

与えられた例から2つのLiveDataを受け取る方法は?

class HomeModel {

            private var tokenLiveDataSource: MediatorLiveData<TokenResponse> = MediatorLiveData()
            private var tokenLiveData: MutableLiveData<TokenResponse> = MutableLiveData()

            private var searchLiveDataSource: MediatorLiveData<SearchResponse> = MediatorLiveData()
            private var searchLiveData: MutableLiveData<SearchResponse> = MutableLiveData()

            fun observeTokenLiveData(): LiveData<TokenResponse> {
                return tokenLiveData
            }

            fun observeSearchLiveData(): LiveData<SearchResponse> {
                return searchLiveData
            }

            fun getSearchResult() {
                // RECEIVE 2 LiveData HERE
            }
        }
4

1 に答える 1