在 RxSwift PublishSubject 上完成后订阅最后一个值

Posted

技术标签:

【中文标题】在 RxSwift PublishSubject 上完成后订阅最后一个值【英文标题】:Subscribe to last value after completed on RxSwift PublishSubject 【发布时间】:2016-09-11 21:58:25 【问题描述】:

我正在寻找这样的东西:

let observable = PublishSubject<String>()
observable.onNext("1")
observable.onCompleted()

_ = observable.subscribeNext  s in
    print(s)

所以我想在 Observable 完成后订阅它并且仍然获得值(或只是最后一个值)。

【问题讨论】:

【参考方案1】:

你使用了错误的Subject 来获得你想要的东西。 Take a look at the descriptions of the Subjects:

PublishSubject:向订阅时的所有观察者广播新事件。

ReplaySubject:向所有订阅者广播新事件,并将指定的bufferSize数量的先前事件广播给新订阅者。

BehaviorSubject:向所有订阅者广播新事件,并向新订阅者广播最新(或初始)值。

变量:包装一个 BehaviorSubject,因此它将向新订阅者发出最新(或初始)值。并且变量也保持当前值状态。变量永远不会发出错误事件。但是,它会自动发出 Completed 事件并在 deinit 时终止。


所以,不要使用PublishSubject,因为它只会在订阅时广播新事件

您可以使用ReplaySubject 获取所有以前的事件,也可以使用ReplaySubjectBehaviorSubjectVariable 获取最近的值。

let disposeBag = DisposeBag()

// ALL previous events
let subject = ReplaySubject<String>.createUnbounded()
// or use this to get just the last, say, 4:
//   let subject = ReplaySubject<String>.create(bufferSize: 4)
// or use one of these to get the most recent:
//   let subject = ReplaySubject<String>.create(bufferSize: 1)
//   let subject = BehaviorSubject(value: "blah")
//   let subject = Variable("blah")

subject.onNext("blah")
subject.onNext("foo")
subject.onCompleted()

subject
    .asObservable()
    .subscribeNext  print($0) 
    .addDisposableTo(disposeBag)

输出:

废话 呵呵

【讨论】:

谢谢。快速提问,如果我做_ = subject ... 我不需要addDisposableTo(disposeBag) 对吗? 这将消除编译警告,但您应该确保首先知道自己在做什么。这个答案很好地解释了它:***.com/a/37725469/343299

以上是关于在 RxSwift PublishSubject 上完成后订阅最后一个值的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift PublishSubject 单元测试

RxSwift - PublishSubject - 忽略错误并继续订阅(不要处置)

正在处理 RxSwift PublishSubject

在 RxSwift PublishSubject 上完成后订阅最后一个值

RxSwift:将 PublishSubject 绑定到多个按钮并接收发送者

如何在按钮点击时观察 PublishSubject