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"를 입력했기 때문에 네트워크 호출이 없어야 합니다. 따라서 디바운스 운영자가 구조에 나선다. 디바운스는 제공된 시간 동안 작업을 수행하며, 해당 시간 사이에 다른 검색어가 들어오면 이전 항목을 무시하고 새 검색어를 사용하여 해당 시간을 다시 기다리기 시작합니다. 주어진 일정한 시간 내에 새로운 내용이 없으면 추가 처리를 위해 해당 검색 쿼리를 진행합니다. 따라서 디바운스는 다른 항목을 방출하지 않고 특정 기간이 경과한 경우에만 Observable에서 항목을 방출합니다.
필터: 필터 연산자는 불필요한 네트워크 호출을 피하기 위해 이 경우 빈 문자열과 같은 원하지 않는 문자열을 필터링하는 데 사용됩니다.
DistinctUntilChanged: UniqueUntilChanged 연산자는 중복된 네트워크 호출을 방지하는 데 사용됩니다. 마지막으로 진행 중인 검색어가 "abc"이고 사용자가 "c"를 삭제하고 다시 "c"를 입력했다고 가정해 보겠습니다. 그래서 다시 "abc"입니다. 따라서 이미 검색어 "abc"로 네트워크 호출이 진행 중이라면 검색어 "abc"로 다시 중복 호출을 하지 않습니다. 따라서 distinctUntilChanged는 소스 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.