2017-08-08 125 views
0

我想訂閱一個observable,但在某些邏輯中,我將重新訂閱它,如果我不想爲它編寫一些特殊的邏輯,那麼當我添加一個新的訂閱或當我添加一個新的訂閱時,如何處理最後的訂閱訂閱它我可以知道這個觀察者是否已經訂閱?RxSwift如何只訂閱一次觀察值?

回答

1

爲什麼你想這樣做?你特別想解決什麼問題?

處理訂閱的常用方法是使用dispose包。

func subscribeMyObservable() 
{ 
    disposeBag = DisposeBag() 

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

請注意,我是如何在訂閱前每次重新創建一次性的?這將擺脫以前的訂閱。

+0

謝謝你的回答。有一些邏輯我需要訂閱動態盟友,所以有些時候可能會重新訂閱一個可觀察的,所以我只是覺得也許有一些特殊的可觀察的,如果有新的訂閱,它會自動取消或者其他一些聰明的方式,現在,我的解決方案就像你的解決方案。 – 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)

這裏是一個遊樂場樣本:

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") 

的結果是:

onNext: 1 
onCompleted 
onDisposed 
done 

是的,這是有用的,你想通過流來過濾事件的地方,在一個位置存儲訂閱尷尬。