Home Articles

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

Asked
Viewed 1739 times
1

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

4 Answers

  • 2

    您正在寻找的最简单的解决方案确实是他们为此提供的方法 - 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

    如果我没有错,你想做什么是订阅而不是在发出物品后取消订阅 .

    如果这就是你想要的,你可以使用 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

  • 0

    你为什么要那样做?你特意试图解决什么问题?

    处理订阅的常用方法是使用配置包 .

    func subscribeMyObservable()
    {
        disposeBag = DisposeBag()
    
        myObservable
           .subscribe(onNext: { print("Whatever") }
           .addDisposableTo(disposeBag)
    }
    

    请注意我在订阅之前每次重新创建一次性用品?这将摆脱以前的订阅 .

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

Related