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 ใช้กับค่าคงที่เวลา ตัวดำเนินการ debounce จะจัดการกรณีเมื่อผู้ใช้พิมพ์ "a", "ab", "abc" ในเวลาอันสั้นมาก ดังนั้นจะมีการโทรผ่านเครือข่ายมากเกินไป แต่ในที่สุดผู้ใช้ก็สนใจผลลัพธ์ของการค้นหา "abc" ดังนั้น คุณต้องละทิ้งผลลัพธ์ของ "a" และ "ab" ตามหลักการแล้ว ไม่ควรมีการโทรผ่านเครือข่ายสำหรับ "a" และ "ab" เนื่องจากผู้ใช้พิมพ์การโทรเหล่านั้นในเวลาอันสั้นมาก ดังนั้นผู้ดำเนินการดีเด้งจึงเข้ามาช่วยเหลือ debounce จะรอตามเวลาที่กำหนดเพื่อดำเนินการใดๆ หากมีข้อความค้นหาอื่นๆ เข้ามาระหว่างเวลานั้น ระบบจะเพิกเฉยต่อรายการก่อนหน้าและเริ่มรอเวลานั้นอีกครั้งด้วยข้อความค้นหาใหม่ หากไม่มีสิ่งใหม่เข้ามาในเวลาคงที่ที่กำหนด ระบบจะดำเนินการกับคำค้นหานั้นเพื่อดำเนินการต่อไป ดังนั้น debounce จะปล่อยไอเท็มจาก Observable หากช่วงเวลาหนึ่งผ่านไปโดยไม่ปล่อยไอเท็มอื่นออกมา
ตัวกรอง: ตัวดำเนินการตัวกรองใช้เพื่อกรองสตริงที่ไม่ต้องการ เช่น สตริงว่าง ในกรณีนี้ เพื่อหลีกเลี่ยงการโทรผ่านเครือข่ายที่ไม่จำเป็น
DistinctUntilChanged: ตัวดำเนินการ differentUntilChanged ถูกใช้เพื่อหลีกเลี่ยงการโทรผ่านเครือข่ายที่ซ้ำกัน สมมติว่าคำค้นหาล่าสุดที่กำลังดำเนินอยู่คือ "abc" และผู้ใช้ลบ "c" แล้วพิมพ์ "c" อีกครั้ง อีกครั้งมันคือ "abc" ดังนั้นหากการโทรผ่านเครือข่ายเกิดขึ้นพร้อมกับคำค้นหา "abc" ก็จะไม่ทำการโทรซ้ำอีกครั้งด้วยคำค้นหา "abc" ดังนั้น differentUntilChanged ระงับรายการที่ซ้ำกันติดต่อกันที่ปล่อยออกมาจากแหล่งที่มาที่สังเกตได้
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.