25

メッセージが到着するたびにビープ音を鳴らすインスタント メッセージング アプリがあるとします。ビープ音を鳴らしたいdebounceのですが、次のメッセージではなく、最初に届いたメッセージに対してビープ音を鳴らしたいと思います (たとえば、2 秒間)。

もう 1 つの例として、アプリが入力通知を送信する (チャットしているユーザーが、私がメッセージを入力していることを確認できるようにする) ことが考えられます。入力を開始したときに入力通知を送信したいのですが、新しいものは X 秒間隔でのみ送信するため、入力するすべての文字に対して入力通知を送信するわけではありません。

これは理にかなっていますか?そのためのオペレーターはありますか?既存の事業者で実現できるか?

これは最初の例の私のコードです。で解決していますがdebounce、理想的ではありません。1 秒間隔で 1000 件のメッセージを受信すると、最後のメッセージが到着するまでサウンドが再生されません (最初のメッセージでサウンドを再生したい)。

self.messagesHandler.messages
            .asObservable()
            .skip(1)
            .debounce(2, scheduler: MainScheduler.instance)
            .subscribeNext { [weak self] message in
                    self?.playMessageArrivedSound()
            }.addDisposableTo(self.disposeBag)

ありがとう!

4

2 に答える 2

30

RxSwift 3 用に更新され、throttleオペレーターが改善されました

RxSwift 3.0.0-beta.1 で導入された operatorの新しい動作によりthrotlle、次のように使用できます。

    downloadButton.rx.tap
    .throttle(3, latest: false, scheduler: MainScheduler.instance)
    .subscribe(onNext: { _ in
        NSLog("tap")
    }).addDisposableTo(bag)

古いバージョンの回答

演算子を使用してから、を使用してフラットwindowに変換します。Observable<Observable<Type>>ObservableflatMap

このサンプル コードは、3 秒ごとのウィンドウの最初のタップ (またはタップ カウントが 10000 を超えた場合) に対してのみ「タップ」を出力します。

    downloadButton.rx_tap
    .window(timeSpan: 3, count: 10000, scheduler: MainScheduler.instance)
    .flatMap({ observable -> Observable<Void> in
        return observable.take(1)
    })
    .subscribeNext { _ in
        NSLog("tap")
    }.addDisposableTo(bag)
于 2016-02-16T17:31:41.467 に答える
1

Window は優れたソリューションですが、サンプル オペレーターの方が直感的で、正しい動作をしていると思います。

messagesHandler.messages
               .sample(Observable<Int>.timer(0.0, period: 2.0, scheduler: MainScheduler.instance))
               .subscribeNext { [weak self] message in
                    self?.playMessageArrivedSound()
               }.addDisposableTo(self.disposeBag)

スロットル操作が思い通りにいかない。

スロットルがあまりにも混乱していると感じる人のために:

詳細については、「ソースオブザーバブルが指定された期間イベントの送信を停止した場合にのみ、スロットルはイベントを転送します。これは通常のイベント配信ではうまく機能しません」.

この場合、必要なフィルターは

sample(Observable<Int>.timer(0.0, period: 2.0, scheduler: MainScheduler.instance))
于 2016-07-12T11:58:36.750 に答える