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

在RxSwift PublishSubject上完成后订阅最后一个值,swift,rx-swift,reactivex,Swift,Rx Swift,Reactivex,我在找这样的东西: let observable = PublishSubject<String>() observable.onNext("1") observable.onCompleted() _ = observable.subscribeNext { s in print(s) } let observable=PublishSubject() 可观察。onNext(“1”) 可观察的。未完成的() _=可观测的.subscribeNext{s in 印刷品 }

我在找这样的东西:

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

_ = observable.subscribeNext { s in
    print(s)
}
let observable=PublishSubject()
可观察。onNext(“1”)
可观察的。未完成的()
_=可观测的.subscribeNext{s in
印刷品
}

因此,我希望在Observable完成后订阅它,并且仍然可以获得值(或者仅仅是最后一个值)。

您使用了错误的
主题来获取所需内容:

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

ReplaySubject:向所有订阅服务器广播新事件,并向新订阅服务器广播以前事件的指定缓冲区大小数

行为主体:向所有订阅者广播新事件,并向新订阅者广播最新(或初始)值

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


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

您可以使用
ReplaySubject
获取所有以前的事件,也可以使用
ReplaySubject
Behavior Subject
Variable
获取最近的值

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)
let dispebag=dispebag()
//所有以前的事件
让subject=ReplaySubject.createUnbounded()
//或者用这个来得到最后一个,比如说,4:
//让subject=ReplaySubject.create(bufferSize:4)
//或者使用其中一个来获取最新的:
//让subject=ReplaySubject.create(bufferSize:1)
//让subject=BehaviorSubject(值:“废话”)
//让主题=变量(“废话”)
subject.onNext(“废话”)
subject.onNext(“foo”)
subject.onCompleted()
主题
.asObservable()
.subscribebenext{print($0)}
.addDisposableTo(disposeBag)
产出:

废话


非常感谢。快速提问,如果我做了
\uuu=subject…
我不需要
添加DisposableTo(disposeBag)
正确吗?这将消除编译警告,但您应该确保知道首先要做什么。这个答案很好地解释了这一点: