RxSwift - 3. Subject
Subject
同時に観察者として観察できる
Subjectに渡されたイベントをObserverの最も基本的なSubjectに渡します.つまり、イベントを渡す役割と、イベントを受信する役割を同時に果たすことができます.
Subjectのタイプ
PublishSubject
空(要素を含まない)に作成され、サブスクリプション・サーバはサブスクリプション・ポイント以降に発生したイベントのみを受信します.
let subject = PublishSubject<String>()
subject.onNext("hello?")
上記のコードを実行しても何も起こりません.購読者がいないからです.let subscriber = subject
.subscribe(onNext: { str in
print(str)
})
同様に、サブスクリプションのコードを挿入すると、印刷文も実行されません.
次のコードを追加subject.onNext("Hi")
今回はprint文を実行します.
PublishSubjectは時間ストリームに関連するモデルに非常に適している.
例えば、あるストリーミングメディアサイトでは、12時に放送を終了し、9時59分に「1分後に放送を終了する」.プロンプトでは、10時1分にログインしたユーザーはこの情報を知る必要はありません.
過去の通知が必要な場合は、BehaviorSubjectを使用します.
BehaviorSubject
PublishSubjectに似ています.差異は初期値で作成する必要があります.subscribeが発生すると、発生時間前に発生した最新イベントが受信されます.
上記のPublish Subjectと非常に似ていますが、Subscriberが発生すると、最近発生したイベントがすぐに発行されます.let disposeBag = DisposeBag()
enum MyError: Error {
case error
}
let b = BehaviorSubject<Int>(value: 0)
b.subscribe { print("BehaviorSubject >>", $0) }
.disposed(by: disposeBag)
b.onNext(1)
b.subscribe { print("BehaviorSubject2 >>", $0) }
.disposed(by: disposeBag)
b.onError(MyError.error)
b.subscribe { print("BehaviorSubject3 >>", $0) }
.disposed(by: disposeBag)
最初にBehavior Subjectを購読すると、デフォルト値0が解放されます.
1がリリースされ、新しいサブスクライバが表示されると、最近のリリース値1が同時に受信されます.
errorの後に購読すると、errorメッセージが同時に受信されます.
ReplaySubject
BufferSizeとともに作成します.BehavorSubjectと似ていますが、受信した最新イベントはBufferSizeと同じです.
let disposeBag = DisposeBag()
enum MyError: Error {
case error
}
let rs = ReplaySubject<Int>.create(bufferSize: 3)
(1...10).forEach { rs.onNext($0) }
rs.subscribe{ print("Observer 1 >>", $0) }
.disposed(by: disposeBag)
rs.subscribe{ print("Observer 2 >>", $0) }
.disposed(by: disposeBag)
rs.onNext(11)
rs.subscribe{ print("Observer 3 >>", $0) }
.disposed(by: disposeBag)
rs.onError(MyError.error)
rs.subscribe{ print("Observer 4 >>", $0) }
.disposed(by: disposeBag)
コメントとソース
http://reactivex.io/documentation/subject.html
https://yeonduing.tistory.com/61
https://rhammer.tistory.com/289
Reference
この問題について(RxSwift - 3. Subject), 我々は、より多くの情報をここで見つけました
https://velog.io/@rnfxl92/RxSwift-3.-Subject
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
PublishSubject
空(要素を含まない)に作成され、サブスクリプション・サーバはサブスクリプション・ポイント以降に発生したイベントのみを受信します.
let subject = PublishSubject<String>()
subject.onNext("hello?")
上記のコードを実行しても何も起こりません.購読者がいないからです.let subscriber = subject
.subscribe(onNext: { str in
print(str)
})
同様に、サブスクリプションのコードを挿入すると、印刷文も実行されません.次のコードを追加
subject.onNext("Hi")
今回はprint文を実行します.PublishSubjectは時間ストリームに関連するモデルに非常に適している.
例えば、あるストリーミングメディアサイトでは、12時に放送を終了し、9時59分に「1分後に放送を終了する」.プロンプトでは、10時1分にログインしたユーザーはこの情報を知る必要はありません.
過去の通知が必要な場合は、BehaviorSubjectを使用します.
BehaviorSubject
PublishSubjectに似ています.差異は初期値で作成する必要があります.subscribeが発生すると、発生時間前に発生した最新イベントが受信されます.
上記のPublish Subjectと非常に似ていますが、Subscriberが発生すると、最近発生したイベントがすぐに発行されます.
let disposeBag = DisposeBag()
enum MyError: Error {
case error
}
let b = BehaviorSubject<Int>(value: 0)
b.subscribe { print("BehaviorSubject >>", $0) }
.disposed(by: disposeBag)
b.onNext(1)
b.subscribe { print("BehaviorSubject2 >>", $0) }
.disposed(by: disposeBag)
b.onError(MyError.error)
b.subscribe { print("BehaviorSubject3 >>", $0) }
.disposed(by: disposeBag)
最初にBehavior Subjectを購読すると、デフォルト値0が解放されます.
1がリリースされ、新しいサブスクライバが表示されると、最近のリリース値1が同時に受信されます.
errorの後に購読すると、errorメッセージが同時に受信されます.
ReplaySubject
BufferSizeとともに作成します.BehavorSubjectと似ていますが、受信した最新イベントはBufferSizeと同じです.
let disposeBag = DisposeBag()
enum MyError: Error {
case error
}
let rs = ReplaySubject<Int>.create(bufferSize: 3)
(1...10).forEach { rs.onNext($0) }
rs.subscribe{ print("Observer 1 >>", $0) }
.disposed(by: disposeBag)
rs.subscribe{ print("Observer 2 >>", $0) }
.disposed(by: disposeBag)
rs.onNext(11)
rs.subscribe{ print("Observer 3 >>", $0) }
.disposed(by: disposeBag)
rs.onError(MyError.error)
rs.subscribe{ print("Observer 4 >>", $0) }
.disposed(by: disposeBag)
コメントとソース
http://reactivex.io/documentation/subject.html
https://yeonduing.tistory.com/61
https://rhammer.tistory.com/289
Reference
この問題について(RxSwift - 3. Subject), 我々は、より多くの情報をここで見つけました https://velog.io/@rnfxl92/RxSwift-3.-Subjectテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol