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: Здесь оператор устранения дребезга используется с постоянной времени. Оператор устранения дребезга обрабатывает случай, когда пользователь вводит «a», «ab», «abc» за очень короткое время. Так что сетевых вызовов будет слишком много. Но пользователя в конечном итоге интересует результат поиска «abc». Итак, вы должны отбросить результаты «a» и «ab». В идеале не должно быть сетевых вызовов для «a» и «ab», поскольку пользователь вводит их за очень короткое время. Итак, на помощь приходит оператор debounce. Средство устранения дребезга будет ждать заданное время для каких-либо действий. Если между этим временем появится какой-либо другой поисковый запрос, он проигнорирует предыдущий элемент и снова начнет ждать этого времени с новым поисковым запросом. Если за заданное постоянное время ничего нового не поступает, он продолжит выполнение этого поискового запроса для дальнейшей обработки. Таким образом, debounce выдает элемент из Observable только в том случае, если определенный промежуток времени прошел без выдачи другого элемента.
Фильтр: в этом случае оператор фильтра используется для фильтрации нежелательной строки, например пустой строки, чтобы избежать ненужного сетевого вызова.
DistinctUntilChanged: оператор DifferentUntilChanged используется во избежание дублирования сетевых вызовов. Допустим, последний текущий поисковый запрос был «abc», и пользователь удалил «c» и снова набрал «c». Итак, снова «abc». Таким образом, если сетевой вызов с поисковым запросом «abc» уже выполняется, повторный вызов с поисковым запросом «abc» не будет повторяться. Таким образом, DifferentUntilChanged подавляет дублирование последовательных элементов, создаваемых исходным 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.