我想订阅一个observable,但在某种逻辑上,我会重新订阅它。如果我不想为它编写一些特殊的逻辑,那么在添加新订阅时如何处理最后一个订阅?或者,当我订阅它时,我怎么知道这个observable是否已经订阅了?
答案 0 :(得分:3)
您正在寻找的最简单的解决方案确实就是他们提供的方法 - 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
是的,这对于您希望通过流过滤事件的地方非常有用,在这个地方难以存储订阅。
答案 1 :(得分: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)
答案 2 :(得分: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");
}
您可以在此处查看更多exmaples https://github.com/politrons/reactive/blob/master/src/test/java/rx/relay/Relay.java