Kotlin コルーチン フローが時間間隔のデバウンスを送信する

Kotlin コルーチン フローが時間間隔のデバウンスを送信する

デバウンスの機能は、連続的に送信されるデータの間隔を空けることです。典型的なアプリケーション シナリオは、検索エンジンでのキーワード入力です。ユーザーが文字を入力するとき、ユーザーが 1 つの単語を入力するたびにバックグラウンドで実際のクエリをトリガーすることは予期されていない場合がありますが、ユーザーは一定時間後に入力が期待され(この時点でユーザーは完全なキーワードの入力を完了していると推測されます)、実際には最後の入力が送信されます。デバウンスには特定のバッファリングのアイデアが含まれています。つまり、イベントはすぐにはトリガーされませんが、送信されるデータは最初にキューに入れられ、トリガーは一定期間(時間)遅延されます。トリガーは前のデータと次のデータに依存します。前のデータと次のデータは起動されておらず、ヒットを待っているだけであることに注意してください。2 つの連続した間隔が timeOut を満たす場合、データの最後の部分のみが保持されます。

 

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    val timeOut = 100L

    runBlocking {
        val result = userInput()
            .debounce(timeOut).collect {
                println(it)
            }
    }
}

fun userInput() = flow {
    emit("A")
    delay(100)
    emit("AB")
    delay(150)
    emit("ABC")
    delay(200)
    emit("ABCD")
    delay(100)
    emit("ABCDE")
}

 

timeOut=100の場合

AB
ABC
ABCD
ABCDE

AとABの両方を送信することになりますが、AとABの間隔は100なので、Aを飛ばしてABを直接送信します。

AB 起動後、ABC と前の AB の間隔が 100 を超えるため、起動を続行します。

 

 

 

 

timeOut=150 の場合は、さらにわかりにくくなります。

AB
ABC
ABCDE

A は起動を待っており、Kotlin は A と AB の間の間隔が 100 しかないことを発見したため、A は破棄されます。Kotlin は、AB の後の A から ABC までの待機時間が 150 を超えており、前の A が起動していないことを発見しました。 ABが発売されました。

AB を起動した後、次の ABC と AB の間には 150 の間隔があり、ABC と AB の間にはまだ時間間隔があるため、ABC を送信し続けます。

ABC の起動後、Kotlin は起動される ABCD を検査します。ABCD と ABC の間の間隔は 200 であり、起動 timeOut 値を満たしますが、ABCD と ABCDE の間の間隔は 100 であるため、ABCD はスキップされ、ABCDE は無視されます。直接起動しました。ここで特に注意してください Kotlin は現在のデータを送信するときに、このデータの前の項目と次の項目を読み取る必要があります。

 

 

 

timeOut=200の場合

ABC
ABCDE

A と AB の間の間隔は 100 であり、A は破棄されます。AB と前の A の間の間隔は 100、ABC と ABC の間の間隔は 150 ですが、これは timeOut 値未満であるため、破棄されます。ABC とその前の AB の間には時間間隔があり、ABCD と次の ABCD の間の間隔は timeOut 値とちょうど等しいため、送信されます。

 

 

 

timeOut=250の場合

ABCDE

 

簡単に言うと、Kotlin がデバウンスを使用して現在のデータを起動する場合、このデータの前のデータと次のデータは、起動する前に時間間隔を満たす必要があり、そうでない場合は破棄されます。

 

Kotlin コルーチン フロー、firstOrNull は first first のみ、lastOrNull は last_zhangphil のブログ - CSDN ブログfirstOrNull() //大量のデータが出力されますが、必要なのは初めて出力されたデータのみです。.lastOrNull() //大量のデータを送信しますが、必要なのは最後に送信したデータだけです。1. フロー、エミット、onCompletion、収集。https://blog.csdn.net/zhangphil/article/details/132492588 kotlin コルーチン フロー フィルター マップ flowOn zip 結合 (1)_zhangphil のブログ - CSDN ブログ1. flow、emit、onCompletion、collect。4 番目に、データのマップ、再編成、および再書き込みを行います。8、コンフレートマージ。9、デバウンス重複排除。2つ目は、フローとしての機能です。https://blog.csdn.net/zhangphil/article/details/130084723

 

おすすめ

転載: blog.csdn.net/zhangphil/article/details/132515686