2016-09-11 13 views
3

を完了した後、最後の値を購読私はこのような何かを探しています:RxSwift PublishSubjectに

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

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

だから私はそれがすでに完了して、まだちょうど値(または取得した後に観察可能にサブスクライブしたいです最後の値)。

答えて

12

あなたが間違って使用していますSubjectあなたが欲しいものを得るために。 Take a look at the descriptions of the Subjects

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

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

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

変数:BehaviorSubjectをラップするので、最新の(または初期の)値が新しいサブスクライバに送信されます。変数は現在の値の状態も保持します。 VariableはErrorイベントを出力しません。ただし、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の

+0

はありがとうございます。簡単な質問ですが、 '_ = subject ...'を実行すると 'addDisposableTo(disposeBag)'は必要ありません。 –

+0

それはコンパイルの警告を取り除くでしょうが、まずあなたが何をやっているのか知っているはずです。この回答はかなりうまく説明しています:http://stackoverflow.com/a/37725469/343299 – solidcell

関連する問題