2017-08-08 10 views
0

私はobservableを購読したいと思っていますが、いくつかのロジックでは、私はそれを再購読します。もし私が特別なロジックを書こうとしないなら、新しい購読を追加するとき、それを購読するこの観察可能なものが購読されているかどうかわかりますか?RxSwift監視対象を1回だけ購読するには?

答えて

1

なぜそれをしたいですか?あなたが特に解決しようとしている問題は何ですか?

サブスクリプションを処分する通常の方法は、処分バッグを使用することです。

func subscribeMyObservable() 
{ 
    disposeBag = DisposeBag() 

    myObservable 
     .subscribe(onNext: { print("Whatever") } 
     .addDisposableTo(disposeBag) 
} 

サブスクリプションの前にディスポーザブルを再作成する方法を教えてください。それは以前の購読を取り除くでしょう。

+0

私はダイナミックなアライブを購読する必要があるいくつかのロジックがありますので、時にはオブザーバブルを再購読することもありますので、新しい購読があれば特別な観測可能性があると思います。前の1つまたはいくつかの他のスマートな方法、今のところ、私のソリューションはあなたのようなものです。 – Bruno

+0

'takeWhile'または' takeUntil'演算子を見ることができますが、これを行うための最良の方法は、私が記述した通りです。 – Odrakir

0

.switchLatest()オペレータはあなたの友達です

let eventObservableWrapper = PublishSubject<Observable<MyEvent>>() 
let eventObservable = eventObservableWrapper.switchLatest() // use this one for subscriptions 

// to switch to another observable, call - 
eventObservableWrapper.onNext(someNewEventObservable) 

は、スイッチがここにどのように機能するかについての詳細を参照してください - http://reactivex.io/RxJava/javadoc/rx/Observable.html#switchOnNext(rx.Observable)

0

あなたは - 私が間違って購読することでない場合にどうするかをしたいですし、一度項目が放出されると、購読を停止することはありません。

あなたが望むものなら、決して退会しないrelayを使うことができます。

/** 
    * ReplayRelay it works just like hot observables, once that an observer subscribe, the Relay will replay all items already emitted 
    * to another observer. 
    * it should return 1,2,3,4,5 for both observers. 
    */ 
    @Test 
    public void testReplayRelay() { 
     ReplayRelay<String> relay = ReplayRelay.create(); 
     relay.subscribe(result -> System.out.println("Observer1:" + result)); 
     relay.call("1"); 
     relay.call("2"); 
     relay.call("3"); 
     relay.subscribe(result -> System.out.println("Observer2:" + result)); 
     relay.call("4"); 
     relay.call("5"); 
    } 

あなたはここにhttps://github.com/politrons/reactive/blob/master/src/test/java/rx/relay/Relay.java

0

あなたが探しているもののための最も簡単な解決策は確かに彼らはただそのために提供される方法で、よりexmaplesを見ることができます - func take(_ count: Int)

onNext: 1 
onCompleted 
onDisposed 
done 

そして、はい、この場所で、あなたはストリームを介してイベントをフィルタ処理したい場所に便利です。

import RxSwift 

var variable = Variable(1) 
variable.asObservable().take(1).subscribe(
    onNext: { print("onNext: \($0)") }, 
    onError: { print("onError: \($0)") }, 
    onCompleted: { print("onCompleted") }, 
    onDisposed: { print("onDisposed") }) 
variable.value = 2 

print("done") 

結果は以下のとおりです。ここ

は、遊び場のサンプルですサブスクリプションを保存するのは面倒です。

関連する問題