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()
}
Anti-rebond : ici, l'opérateur anti-rebond est utilisé avec une constante de temps. L'opérateur anti-rebond gère le cas où l'utilisateur tape « a », « ab », « abc », dans un temps très court. Il y aura donc trop d'appels réseau. Mais l'utilisateur est finalement intéressé par le résultat de la recherche « abc ». Vous devez donc ignorer les résultats de « a » et « ab ». Idéalement, il ne devrait y avoir aucun appel réseau pour « a » et « ab », car l'utilisateur les a tapés en très peu de temps. Ainsi, l'opérateur anti-rebond vient à la rescousse. L'anti-rebond attendra le temps imparti pour faire quoi que ce soit, si une autre requête de recherche intervient entre ce moment, il ignorera l'élément précédent et recommencera à attendre ce temps avec la nouvelle requête de recherche. Si rien de nouveau n'arrive dans ce temps constant donné, il poursuivra cette requête de recherche pour un traitement ultérieur. Ainsi, l'anti-rebond n'émet un élément d'un observable que si un laps de temps particulier s'est écoulé sans qu'il émette un autre élément.
Filtre : L'opérateur de filtre est utilisé pour filtrer la chaîne indésirable comme une chaîne vide dans ce cas afin d'éviter l'appel réseau inutile.
DistinctUntilChanged : l'opérateur distinctUntilChanged est utilisé pour éviter les appels réseau en double. Disons que la dernière requête de recherche en cours était « abc » et que l'utilisateur a supprimé « c » et a tapé à nouveau « c ». Encore une fois, c'est « abc ». Ainsi, si l'appel réseau est déjà en cours avec la requête de recherche « abc », il ne fera pas à nouveau l'appel en double avec la requête de recherche « abc ». Ainsi, distinctUntilChanged supprime les éléments consécutifs en double émis par la source Observable.
flatMapLatest : Ici, l'opérateur switchMap est utilisé pour éviter les résultats des appels réseau qui ne sont plus nécessaires à l'affichage à l'utilisateur. Disons que la dernière requête de recherche était « ab » et qu'il y a un appel réseau en cours pour « ab » et que l'utilisateur a tapé « abc ». Alors vous n’êtes plus intéressé par le résultat de « ab ». Seul le résultat de « abc » vous intéresse. Ainsi, le switchMap vient à la rescousse. Il fournit uniquement le résultat de la dernière requête de recherche (la plus récente) et ignore le reste.
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.