2016-09-12 7 views
4

私はこのようなものがある場合:私はbarの後半で観測可能でunsubscribeにしたい場合は、観測対象から退会するにはどうしたらいいですか?

func foo() -> Observable<Foo> { 
    return Observable.create { observer in 
     // ... 
    } 
    } 

    func bar() { 
    foo().observeOn(MainScheduler.instance) 
     .subscribeNext { 
     // ... 
     } 
     .addDisposableTo(disposeBag) 
    } 

を、私はそれをどのように行うのでしょうか?

更新

私はdisposeを呼び出すことができます承知だけど、RxSwift docsに応じて:あなたは、通常は手動で処分を呼び出すにしたくない

注意。これは教育的な例にすぎません。手動で処理を呼び出すのは、通常、コードの悪臭です。

unsubscribeは実装されていませんか?私はRxSwiftコードを使って動くようになりました。何が起こっているのかを理解することができる程度に、サブスクライブメソッドから返されたDisposableは有用な機能(ディスポーザリング以外のもの)を持つものではありません。

答えて

3

fooからdisposeBagで返されたObservableを追加します。割り当てが解除されると、サブスクリプションが破棄されます。 あなたは "手動" あなたのクラスのどこかに

disposeBag = nil

を呼び出すことによってdisposeBagを解放することができます。

質問の編集後:おそらくいくつかの条件が満たされたときにObservableから一部の受信者を選択的に退会させたいとします。これらの条件を表す別のObservableを使用して、takeUntil演算子を使用して必要に応じてサブスクリプションを取り消すことができます。私はあなたが処分したいときに解放したいときにあなただけのtempBag = nilを行うことができます別のDisposeBag

var tempBag = DisposeBag() 

fun bar() { 
    foo().subscribe().addDisposable(tempBag) 
} 

を作成していた何をしたか

//given that cancellingObservable sends `next` value when the subscription to `foo` is no longer needed 

foo().observeOn(MainScheduler.instance) 
    .takeUntil(cancellingObservable) 
    .subscribeNext { 
    // ... 
    } 
    .addDisposableTo(disposeBag) 
+0

申し訳ありませんが、私の簡略化された例は、1つだけ観察可能です。現実には、私が観察している飛行中に複数のタスクを持ち、いくつかのものから選択的に退会したいと思うでしょう。私が処分袋を解放すれば、彼らはすべて退会されるでしょう。そして私は後でその意図された使用のために処分袋が必要になります。さらに、私は 'dispose'を呼び出すことができると認識していますが、ドキュメントによればこれは悪いコードのにおいです。私の質問の更新テキストを参照してください。ありがとう。 –

+0

あなたのユースケースに応じて、 'takeUntil'は' unsubscribe'と等価かもしれません。私の更新された答えを見てください。 –

-1

。あなたはまだ他の使い捨て物を生き続ける別のDisposeBagを持っています。

+0

これは、最初の「使い捨て」を処分するつもりはありません。まったく新しい「使い捨て」を作成するだけです。 – solidcell

+0

@solidcell私の要点は、いつでも必要に応じて 'tempBag = nil'で解放できる別の' DisposeBag'を作成することです。あなたはまだ他のDisposableを保持する別の 'DisposeBag'を持っています。 – wint

+0

私はあなたが何を意味するかを見ます。しかし、あなたの答えはまだそれを使ってどのように購読を解除するのか、また別の 'DisposeBag'に' tempBag' *を使っていることを示すものではありません。 – solidcell

関連する問題