RxSwift如何只订阅一次可观察的一次?

时间:2017-08-08 03:49:38

标签: swift rx-swift

我想订阅一个observable,但在某种逻辑上,我会重新订阅它。如果我不想为它编写一些特殊的逻辑,那么在添加新订阅时如何处理最后一个订阅?或者,当我订阅它时,我怎么知道这个observable是否已经订阅了?

3 个答案:

答案 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