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()
}
Antirrebote: aquí, el operador antirrebote se utiliza con una constante de tiempo. El operador antirrebote maneja el caso en el que el usuario escribe "a", "ab", "abc" en muy poco tiempo. Entonces habrá demasiadas llamadas de red. Pero el usuario finalmente se interesa por el resultado de la búsqueda “abc”. Por lo tanto, debes descartar los resultados de “a” y “ab”. Idealmente, no debería haber llamadas de red para "a" y "ab", ya que el usuario las escribió en muy poco tiempo. Entonces, el operador antirrebote viene al rescate. El antirrebote esperará el tiempo proporcionado para hacer cualquier cosa; si aparece alguna otra consulta de búsqueda entre ese tiempo, ignorará el elemento anterior y comenzará a esperar ese tiempo nuevamente con la nueva consulta de búsqueda. Si no llega nada nuevo en ese tiempo constante, procederá con esa consulta de búsqueda para su posterior procesamiento. Por lo tanto, el rebote solo emite un elemento de un Observable si ha pasado un período de tiempo particular sin que se emita otro elemento.
Filtro: el operador de filtro se utiliza para filtrar la cadena no deseada como una cadena vacía en este caso para evitar llamadas de red innecesarias.
DistinctUntilChanged: el operador distintivoUntilChanged se utiliza para evitar llamadas de red duplicadas. Digamos que la última consulta de búsqueda en curso fue "abc" y el usuario eliminó "c" y volvió a escribir "c". De nuevo es "abc". Entonces, si la llamada de red ya está en curso con la consulta de búsqueda "abc", no volverá a realizar la llamada duplicada con la consulta de búsqueda "abc". Por lo tanto, distintivoUntilChanged suprime los elementos consecutivos duplicados emitidos por la fuente Observable.
flatMapLatest: aquí, el operador switchMap se utiliza para evitar los resultados de las llamadas de red que ya no son necesarios para mostrarlos al usuario. Digamos que la última consulta de búsqueda fue "ab" y hay una llamada de red en curso para "ab" y el usuario escribió "abc". Entonces ya no estás interesado en el resultado de "ab". Sólo te interesa el resultado de “abc”. Entonces, switchMap viene al rescate. Solo proporciona el resultado de la última consulta de búsqueda (la más reciente) e ignora el resto.
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.