class SearchViewModel ( searchRepository : SearchRepository ) : ViewModel() {
val query = MutableLiveData < String >()
@FlowPreview
@ExperimentalCoroutinesApi
val repo = query.asFlow()
.debounce( 300 )
.filter {
it.trim().isEmpty(). not ()
}
.distinctUntilChanged()
.flatMapLatest {
searchRepository.searchRepo(it).asFlow()
}.asLiveData()
}
デバウンス:ここでは、デバウンス演算子が時定数とともに使用されます。デバウンス オペレーターは、ユーザーが「a」、「ab」、「abc」と入力した場合を非常に短時間で処理します。したがって、ネットワーク呼び出しが多すぎます。しかし、ユーザーは最終的に「abc」という検索結果に興味を持ちます。したがって、「a」と「ab」の結果は破棄する必要があります。理想的には、ユーザーが非常に短時間で「a」と「ab」を入力したときに、ネットワーク呼び出しが発生しないようにする必要があります。そこで、デバウンス オペレーターが役に立ちます。デバウンスは、何かを行うために指定された時間待機します。その時間の間に他の検索クエリが入った場合は、前の項目を無視し、新しい検索クエリで再びその時間の待機を開始します。指定された一定時間内に新しいものがない場合は、その検索クエリを続行してさらなる処理を行います。したがって、デバウンスは、別の項目を発行せずに特定のタイムスパンが経過した場合にのみ、Observable から項目を発行します。
フィルター:フィルター演算子は、この場合、不要なネットワーク呼び出しを回避するために、空の文字列などの不要な文字列をフィルターするために使用されます。
DistinctUntilChanged: distinctUntilChanged 演算子は、ネットワーク呼び出しの重複を避けるために使用されます。最後に実行中の検索クエリが「abc」で、ユーザーが「c」を削除し、再度「c」を入力したとします。ということで、また「abc」です。したがって、検索クエリ「abc」を使用してネットワーク呼び出しがすでに行われている場合、検索クエリ「abc」を使用して再度重複した呼び出しを行うことはありません。したがって、distinctUntilChanged は、ソース Observable によって発行された重複した連続項目を抑制します。
flatMaplatest:ここでは、switchMap オペレーターは、ユーザーに表示する必要のないネットワーク呼び出し結果を回避するために使用されます。最後の検索クエリが「ab」で、「ab」に対するネットワーク呼び出しが進行中で、ユーザーが「abc」と入力したとします。そうすれば、「ab」の結果にはもう興味がなくなります。 「abc」の結果のみに興味があります。そこで、switchMap が役に立ちます。最後の検索クエリ (最新) の結果のみが提供され、残りは無視されます。
Copyright 2019 Hari Singh Kulhari
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.