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()
}
Debounce: Di sini, operator debounce digunakan dengan konstanta waktu. Operator debounce menangani kasus ketika pengguna mengetik “a”, “ab”, “abc”, dalam waktu yang sangat singkat. Jadi akan ada terlalu banyak panggilan jaringan. Namun pengguna akhirnya tertarik dengan hasil pencarian “abc”. Jadi, Anda harus membuang hasil “a” dan “ab”. Idealnya, tidak boleh ada panggilan jaringan untuk “a” dan “ab” karena pengguna mengetikkannya dalam waktu yang sangat singkat. Jadi, operator debounce datang untuk menyelamatkan. Debounce akan menunggu waktu yang ditentukan untuk melakukan apa pun, jika ada permintaan pencarian lain yang muncul di antara waktu tersebut, ia akan mengabaikan item sebelumnya dan mulai menunggu waktu itu lagi dengan permintaan pencarian baru. Jika tidak ada hal baru yang muncul dalam waktu konstan tersebut, permintaan pencarian tersebut akan dilanjutkan untuk diproses lebih lanjut. Jadi, debounce hanya memancarkan item dari Observable jika rentang waktu tertentu telah berlalu tanpa item lain dipancarkan.
Filter: Operator filter digunakan untuk memfilter string yang tidak diinginkan seperti string kosong dalam hal ini untuk menghindari panggilan jaringan yang tidak perlu.
DistinctUntilChanged: Operator distinctUntilChanged digunakan untuk menghindari duplikat panggilan jaringan. Katakanlah permintaan pencarian terakhir yang sedang berjalan adalah "abc" dan pengguna menghapus "c" dan mengetik lagi "c". Jadi sekali lagi itu adalah "abc". Jadi jika panggilan jaringan sudah berlangsung dengan permintaan pencarian “abc”, maka panggilan duplikat tidak akan dibuat lagi dengan permintaan pencarian “abc”. Jadi, DifferentUntilChanged menekan duplikat item berturut-turut yang dipancarkan oleh sumber yang Dapat Diamati.
flatMapLatest: Di sini, operator switchMap digunakan untuk menghindari hasil panggilan jaringan yang tidak diperlukan lagi untuk ditampilkan kepada pengguna. Katakanlah permintaan pencarian terakhir adalah “ab” dan ada panggilan jaringan yang sedang berlangsung untuk “ab” dan pengguna mengetik “abc”. Maka Anda tidak lagi tertarik dengan hasil “ab”. Anda hanya tertarik pada hasil “abc”. Jadi, switchMap datang untuk menyelamatkan. Ini hanya memberikan hasil untuk permintaan pencarian terakhir (terbaru) dan mengabaikan sisanya.
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.