私はこのようなものを探しています:
let observable = PublishSubject<String>()
observable.onNext("1")
observable.onCompleted()
_ = observable.subscribeNext { s in
print(s)
}
したがって、Observableがすでに完了した後でサブスクライブし、それでも値(または最後の値)を取得したいと思います。
間違ったSubject
を使用して必要なものを取得しています。 主題の説明を見てください :
PublishSubject:サブスクリプションの時点ですべてのオブザーバーに新しいイベントをブロードキャストします。
ReplaySubject:すべてのサブスクライバーに新しいイベントをブロードキャストし、指定されたbufferSize数の以前のイベントを新しいサブスクライバーにブロードキャストします。
BehaviorSubject:すべてのサブスクライバーに新しいイベントをブロードキャストし、新しいサブスクライバーに最新の(または初期の)値をブロードキャストします。
Variable:BehaviorSubjectをラップするため、新しいサブスクライバーに最新の(または初期の)値が送信されます。また、Variableは現在の値の状態を維持します。変数がエラーイベントを発行することはありません。ただし、Completedイベントを自動的に発行し、deinitで終了します。
したがって、PublishSubject
はサブスクリプション時に新しいイベントのみをブロードキャストするため、使用しないでください。
ReplaySubject
を使用して以前のすべてのイベントを取得するか、ReplaySubject
、BehaviorSubject
、または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)
出力:
何とか
foo