あなたが間違って使用していますSubject
あなたが欲しいものを得るために。 Take a look at the descriptions of the Subjects:
PublishSubject:サブスクリプションの時点ですべてのオブザーバーに新しいイベントをブロードキャストします。
ReplaySubject:新しいサブスクライバに新しいイベントをブロードキャストし、新しいサブスクライバに対して以前のイベントの指定されたbufferSizeをブロードキャストします。
BehaviorSubject:すべてのサブスクライバに新しいイベントをブロードキャストし、新しいサブスクライバに最新の(または初期の)値をブロードキャストします。
変数:BehaviorSubjectをラップするので、最新の(または初期の)値が新しいサブスクライバに送信されます。変数は現在の値の状態も保持します。 VariableはErrorイベントを出力しません。ただし、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の
はありがとうございます。簡単な質問ですが、 '_ = subject ...'を実行すると 'addDisposableTo(disposeBag)'は必要ありません。 –
それはコンパイルの警告を取り除くでしょうが、まずあなたが何をやっているのか知っているはずです。この回答はかなりうまく説明しています:http://stackoverflow.com/a/37725469/343299 – solidcell