web-dev-qa-db-ja.com

RxSwiftで1回限りのオブザーバブルを破棄する適切な方法

一度だけキックオフしたいというオブザーバブルがあります。ドキュメントは言う:

破棄バッグまたはtakeUntil演算子を使用すると、リソースを確実にクリーンアップできます。シーケンスが有限時間で終了する場合でも、本番環境で使用することをお勧めします。

オブザーバブルは1つのイベントの後で終了します

let observable = Observable.create() { observer in
  webservice.makeHTTPRequestWithCompletionBlock {
    if something {
      observer.on(.Next(...))
      observer.onCompleted()
    } else {
      observer.on(.Error(...))
    }
  }
}

このオブザーバブルのサブスクライバーのキャンセルに興味がなかったとしましょう。一度だけ実行して完了するだけです。このオブザーバブルのライフサイクルは、作業自体が完了したときに終了する必要があります。私が見ることができるdisposeBagの良い候補がないことを意味します。 takeUntilも「イベント」を期待しており、私が見ることができる良いものはありません。

現在、私は使い捨てを捨てることによって警告を解決します:

_ = observeable.subscribeNext { ... }

これを行う方法、または私が使用する必要のある別のパラダイムはありますか?

20
Ying

DiposeBagtakeUntilの両方を使用して、サブスクリプションをキャンセルしますprior.Completed/.Errorイベントの受信。

Observableが完了すると、サブスクリプションの管理に使用されるすべてのリソースが自動的に破棄されます。

RxSwift 2.2以降では、この動作の実装例を AnonymousObservable.Swift で確認できます。

func on(event: Event<E>) {
    switch event {
    case .Next:
        if _isStopped == 1 {
            return
        }
        forwardOn(event)
    case .Error, .Completed:
        if AtomicCompareAndSwap(0, 1, &_isStopped) {
            forwardOn(event)
            dispose()
        }
    }
}

イベントを転送した後、.Errorまたは.Completedイベントを受信したときに、AnonymousObservableSink呼び出しがどのようにそれ自体を破棄するかを確認します。

結論として、この使用例では、_ =が最適です。

27
tomahh