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: Aqui, o operador debounce é usado com uma constante de tempo. O operador debounce trata do caso em que o usuário digita “a”, “ab”, “abc”, em um tempo muito curto. Portanto, haverá muitas chamadas de rede. Mas o usuário finalmente se interessa pelo resultado da pesquisa “abc”. Portanto, você deve descartar os resultados de “a” e “ab”. Idealmente, não deveria haver chamadas de rede para “a” e “ab”, pois o usuário as digitou em um tempo muito curto. Então, o operador debounce vem em socorro. O debounce irá aguardar o tempo fornecido para fazer qualquer coisa, se qualquer outra consulta de pesquisa ocorrer entre esse período, ele irá ignorar o item anterior e começará a aguardar esse horário novamente com a nova consulta de pesquisa. Se nada de novo surgir nesse tempo constante, ele prosseguirá com a consulta de pesquisa para processamento posterior. Portanto, debounce só emite um item de um Observável se um determinado período de tempo tiver passado sem que ele emita outro item.
Filtro: O operador de filtro é usado para filtrar a string indesejada como uma string vazia neste caso para evitar chamadas de rede desnecessárias.
DistinctUntilChanged: O operador distintoUntilChanged é usado para evitar chamadas de rede duplicadas. Digamos que a última consulta de pesquisa em andamento foi “abc” e o usuário excluiu “c” e digitou “c” novamente. Então novamente é “abc”. Portanto, se a chamada de rede já estiver em andamento com a consulta de pesquisa “abc”, ela não fará a chamada duplicada novamente com a consulta de pesquisa “abc”. Portanto, distintoUntilChanged suprime itens consecutivos duplicados emitidos pela fonte Observable.
flatMapLatest: Aqui, o operador switchMap é usado para evitar os resultados da chamada de rede que não são mais necessários para exibição ao usuário. Digamos que a última consulta de pesquisa foi “ab” e há uma chamada de rede em andamento para “ab” e o usuário digitou “abc”. Então você não está mais interessado no resultado de “ab”. Você está interessado apenas no resultado de “abc”. Então, o switchMap vem em socorro. Ele fornece apenas o resultado da última consulta de pesquisa (mais recente) e ignora o restante.
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.