[RxSwfit] - Observable, Subject, Relay


RxSWIFTの勉強を始める
短期的な目標は、アプリケーションストアで発売された最初のアプリケーションをRx+MVVMに再構成することです.
でも本当にまだまだ長い道がありますね既存の方法とは全く違ってMVVMを学ぶのは、確かに難しい!
これからRxにもっと詳しくなって、他の人に説明できる程度になったら、最初から丁寧に説明してもいいですよ!
今回のPostingは毎日紛らわしいObserverable Subject Relayについて
この機会に、私たちは明確に概念を掌握することができると思います.

Observable


イベントを解放します.(Observable -> event -> observer)
他のObserverableは購読できません

Subject


イベントを解放します.(Subject -> event -> observer)
他のObserverableを購読できます!
つまり、観察者と言ってもいいし、観察者と言ってもいい!
あと4種類のSubjectがあります.
subject.onNext("Hello")
subject.onNext("World")
subject.onNext("Swift")

subject
    .subscribe(onNext: {print($0)})
    .disposed(by: bag)

subject.onNext("RxSwift")
subject.onNext("RxCocoa")
subject.onCompleted()
簡単なサンプルコードを見てみましょう.
1.subjectにHello、World、SWIFTを伝える
2.サブスクリプション
3、RxSWIFT、RxCocoaとComplete

1. PublishSubject

let subject = PublishSubject<String>()
PublishSubjectでは、購読者が購読した値のみが渡されます.
したがって、Hello、World、SWIFTは無視され、RxSWIFT、RxCocoaは出力されます.

2. BehaviorSubject

let subject = BehaviorSubject<String>(value: "Start")
BehavorSubjectには初期値があります.また、サブスクリプションの前に渡された最新の値も渡します.
Start,Hello,Worldは無視され,SWIFT,RxSWIFT,RxCocoaはすべて出力されるでしょう.

3. ReplaySubject

let subject = ReplaySubject<String>.create(bufferSize: 3)
ReplaySubjectにはバッファがあります.指定したbufferSizeに最新イベントを保存し、サブスクライバに転送します.

4. AsyncSubject

let subject = AsyncSubject<String>()
AsyncSubjectは、サブスクライバとしてイベントを転送完了すると、最近の次のイベントを転送します.

Relay


RelayはWrapping Subjectです.
public final class PublishRelay<Element>: ObservableType {
    private let subject: PublishSubject<Element>
    
    // Accepts `event` and emits it to subscribers
    public func accept(_ event: Element) {
        self.subject.onNext(event)
    }
    
    /// Initializes with internal empty subject.
    public init() {
        self.subject = PublishSubject()
    }

    /// Subscribes observer
    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        self.subject.subscribe(observer)
    }
    
    /// - returns: Canonical interface for push style sequence
    public func asObservable() -> Observable<Element> {
        self.subject.asObservable()
    }
}
コードを見れば、正確に分かるでしょう?accpetの方法としてonNextのみを処理することに注意してください.

1. PublishRelay

publishSubject를 Wrapping하고 있습니다

2. BehaviorRelay

BehaviorSubject를 Wrapping하고 있습니다

3. ReplayRelay

ReplayRelay를 Wrapping하고 있습니다.
完全なイベントを受信しない場合を除き、実行結果は上記と同じです.
また完全なイベントがもらえないのでAsyncRelayは存在しないのではないでしょうか?
いつ使いますか.
ユーザーはボタンを押して、error、completeイベントは転送すべきではありませんか?
主にUIイベント処理に用いられる.
実はそんなに難しくないでしょう.私も毎日混同していますが、整理するときは本当に簡単です.