web-dev-qa-db-ja.com

RxSwift PublishSubjectで完了した後、最後の値をサブスクライブします

私はこのようなものを探しています:

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

_ = observable.subscribeNext { s in
    print(s)
}

したがって、Observableがすでに完了した後でサブスクライブし、それでも値(または最後の値)を取得したいと思います。

8
Rodrigo Ruiz

間違ったSubjectを使用して必要なものを取得しています。 主題の説明を見てください

PublishSubject:サブスクリプションの時点ですべてのオブザーバーに新しいイベントをブロードキャストします。

ReplaySubject:すべてのサブスクライバーに新しいイベントをブロードキャストし、指定されたbufferSize数の以前のイベントを新しいサブスクライバーにブロードキャストします。

BehaviorSubject:すべてのサブスクライバーに新しいイベントをブロードキャストし、新しいサブスクライバーに最新の(または初期の)値をブロードキャストします。

Variable:BehaviorSubjectをラップするため、新しいサブスクライバーに最新の(または初期の)値が送信されます。また、Variableは現在の値の状態を維持します。変数がエラーイベントを発行することはありません。ただし、Completedイベントを自動的に発行し、deinitで終了します。


したがって、PublishSubjectはサブスクリプション時に新しいイベントのみをブロードキャストするため、使用しないでください。

ReplaySubjectを使用して以前のすべてのイベントを取得するか、ReplaySubjectBehaviorSubject、または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

22
solidcell