リクエストパラメータに基づいて異なる結果になるAPIエンドポイントがあります。パラメータはpage
,per_page
,query
などです。さまざまなパラメータで結果のカウントとキャッシングを保証する方法
fun getItems(params : Map<String, String>) : Single<ItemsResponse>
data class ItemsResponse(
val hasMore : Boolean,
val items : List<Items>
)
APIは信頼性が低く、per_page
未満の値を返す可能性があります。私は、常に私が必要とする結果の数を取得し、次の要求サイクルのために残りをキャッシュするようにしたい。
例えば何か
val page : Int = 1
fun fetchItems(requestedItems : Int = 20) : Single<List<Items>> {
...
.map { buildParams(page, perPage, query) }
.flatMap { api.getItems(it) }
.doOnSuccess { page++ }
.buffer(requestedItems)
}
fun buildParams(page: Int, perPage: Int, query : String) : Map<String, String> {
...
}
シナリオ例:
- 発信者は、最初に20の項目を要求します。
page: 1
とapi.getItems()
から - コール、
per_page
が常に20- コールは16の項目
- コール
api.getItems()
page: 2
とコールリターンに19の項目
- 20を返しますアイテムは呼び出し元に返され、15残りのアイテムは次の発呼者の要求のためにキャッシュされました。
- 発信者は2回目に20アイテムをリクエストします。
page: 3
- 呼に
api.getItems()
から - 電話で呼び出し元に戻された12の項目
- 呼に
- 20アイテムを返す(15古い5最後の応答から)7つの残りの項目は次の発信者の要求のためにキャッシュされました。
- などなど。
これはプロデューサ - コンシューマパターンのようですが、RxJava2
で実行できますか?
確かに、私は正確に知りません。しかし、私はそれがページネーションのように見えると思いますか? – SaidbakR
ページネーションですが、特定の結果カウントを保証する必要があるケースがあります。誰かが「次のページをお願いします」と要求し、20の代わりに16または19ではなく、「ページごとに」カウントを返す必要があります。 –
残りの部分を空の値または空の値で塗りつぶします。 – SaidbakR