RxSwift-处理订阅是否会导致基础序列发出onComplete?

时间:2018-11-01 12:51:50

标签: swift reactive

我正在阅读由Packt(https://www.oreilly.com/library/view/reactive-programming-with/9781787120211/)撰写的有关RxSwift的“使用Swift 4进行反应式编程”的书。该书在一节中说:

  

“处置订阅将导致潜在的Observable   发出完成事件并终止的顺序”

但是我发现这句话是不正确的。这是一个示例:

        let publisher = PublishSubject<Int>() //Create an <Int> sequence
        let subscription1 = publisher.asObservable() //Create 1st subscription
            .debug("Subscription 1")
            .subscribe { (event) in
            print(event)
        }
        let subscription2 = publisher.asObservable() //Create 2nd subscription
            .debug("Subscription 2")
            .subscribe { (event) in
                print(event)
        }
        publisher.onNext(1) //Emit first event
        subscription1.dispose() //Dispose the 1st subscription. According to the phrase above, publisher should emit an onComplete event
        publisher.onNext(2) //Emit second event

正如我在代码中的注释所说,在 subscription1.dispose()中, publisher 应该发出一个onComplete事件,但实际上它仍然可以发出新事件像往常一样,因此输出:

2018-11-01 19:43:59.796: Subscription 1 -> subscribed
2018-11-01 19:43:59.798: Subscription 2 -> subscribed
2018-11-01 19:43:59.798: Subscription 1 -> Event next(1)
next(1)
2018-11-01 19:43:59.798: Subscription 2 -> Event next(1)
next(1)
2018-11-01 19:43:59.799: Subscription 1 -> isDisposed
2018-11-01 19:43:59.799: Subscription 2 -> Event next(2)
next(2)

任何人都可以确认我的理解正确吗?还是我错过了RxSwift幕后的任何东西?

预先感谢

2 个答案:

答案 0 :(得分:0)

您对取消订阅的理解是正确的:处置订阅不会导致onComplete运行。但是,当到达onComplete或onError时,它将自动取消订阅(http://reactivex.io/documentation/contract.html“订阅和取消订阅”部分非常有用)

答案 1 :(得分:0)

我刚刚通过 Google 遇到了这个问题,所以会为可能有类似问题的任何人提供更彻底的回答。

这里的整个误解是由两种不同类型的可观察对象引起的:

  1. 冷观察。
  2. 热门 observable。

冷 observables 与其订阅密切相关。他们在订阅之前不会启动任何操作,并且会在您处理他们的所有订阅后立即终止。这些是书中引用的内容。

Hot observables 会在创建后立即开始它们的设计目的,而不管它们当前的订阅者如何。他们将一直运行直到他们的内部操作完成,无论他们目前有 5 个订阅者还是没有订阅者。这些是您的示例中的那些。

始终注意您当前使用的是哪种类型的 observable。例如,cold observable 的操作可能会为每个订阅者单独启动,因此,例如,如果您正在处理 http 请求,请注意不要通过多次订阅来多次发起相同的请求。另一方面,热 observables 的主要陷阱正是在您的问题中 - 在它完成它的动作之前它不会终止。

希望能消除一些困惑。