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:這裡,debounce 運算子與時間常數一起使用。去抖動運算子處理使用者在很短的時間內輸入「a」、「ab」、「abc」的情況。所以會出現過多的網路呼叫。但用戶最終對搜尋「abc」的結果感興趣。因此,您必須丟棄“a”和“ab”的結果。理想情況下,當使用者在很短的時間內鍵入“a”和“ab”時,不應該有網路呼叫。因此,去抖操作符就來救援了。反跳將等待提供的時間來執行任何操作,如果在該時間之間出現任何其他搜尋查詢,它將忽略前一個項目並開始再次等待新搜尋查詢的時間。如果在給定的恆定時間內沒有出現任何新內容,它將繼續執行該搜尋查詢以進行進一步處理。因此,debounce 僅在特定時間跨度過去且未發出另一個專案的情況下從 Observable 發出一個專案。
過濾器:過濾器運算子用於過濾不需要的字串,例如本例中的空字串,以避免不必要的網路呼叫。
DistinctUntilChanged: distinctUntilChanged 運算子用於避免重複的網路呼叫。假設最後一個正在進行的搜尋查詢是“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.