2017-08-08 612 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 

是的,这是有用的,你想通过流来过滤事件的地方,在一个位置存储订阅尴尬。