RxSwift - Relay



Relay ClassはRxCocoa 4で実施され、PublishRelayおよびBehaviorRelayクラスが存在する.
RelayはRxCocoaのクラスであり、RxSwiftのSubjectとは異なる.

  • Error、完了したイベントは存在せず、ライフサイクル終了は存在しません.

  • Dispose以外の機能は終了していないので、UIに接続するのに適しています.

  • イベントの種類はAcceptのみですnextにリリースします.
  • PublishRelay


    PublishSubjectと同様の機能を実行します.
    (Publish Subjectの場合は、購読前に解放されたイベントは無視してください.)
    違いはacceptによってイベントを解放することです.
            let pRelay = PublishRelay<Int>()
            
            pRelay.accept(Int.random(in: 0..<4)) //무시
            
            pRelay.subscribe(onNext : {
                print($0)
            }).disposed(by: disposeBag)
            
            pRelay.accept(Int.random(in: 0..<4))
            
            pRelay.subscribe(onNext: {
                print($0)
            }).disposed(by: disposeBag)
            
            pRelay.accept(Int.random(in: 0..<4))
    3
    1
    1
    値が共有できる部分も同じです.

    BehaviorRelay


    包装BehavorSubjectvalueを使用して現在の値を取り出すことができます。(読み取り専用)valueを変更するために。accept()の使用


    subjectとの違い

      let b = BehaviorSubject<[String]>(value: ["하나","둘","셋","넷"])
    
            let bValue = b.value
    
            b.asObservable().subscribe { print($0) }.disposed(by: disposeBag)
    
            do {
                try b.onNext(bValue() + ["다섯"])
            }catch {
                print(error)
            }
    next([“1”、“2”、“3”、“4”])
    next([“1”、“2”、“3”、“4”、“5”])
    valueにアクセスして追加するには、オブジェクトがerrorを解放するため、docatch文を使用する必要があります.
     let a = BehaviorRelay<[Int]>(value: [1,2,3,4])
            let v = a.asObservable()
            
            v.subscribe { print($0) }.disposed(by: disposeBag)
            
            a.accept(a.value + [5] )
            
    next([1, 2, 3, 4])
    next([1, 2, 3, 4, 5])
    ただし、Relayにはerrorとcompletedがないためdocatch文は必要ありません.
    value+とacceptの違い
     a.accept(a.value + [5] )
            
     a.accept([6])
    next([1, 2, 3, 4])
    next([1, 2, 3, 4, 5])
    next([6])

    ReplayRelay


    RxSwift 6からReplayRelayを追加.
    ReplaySubjectと同様の作成機能があります.
    でもonNextとAcceptの違いは
    error,completedの間に差がある.
            let r = ReplayRelay<Int>.create(bufferSize: 2)
            (1...10).forEach { r.accept($0) }
            
            r
                .asObservable()
                .subscribe { print($0)}.disposed(by: disposeBag)
            
            let first = r.subscribe { print("첫번째 observer == \($0)")}
            first.disposed(by: disposeBag)
            
            
            let second = r.subscribe { print("두번째 observer == \($0)")}
            second.disposed(by: disposeBag)
            
            r.accept(99)
            r.accept(999)
            r.accept(9999)
    next(9)
    next(10)
    첫번째 observer == next(9)
    첫번째 observer == next(10)
    두번째 observer == next(9)
    두번째 observer == next(10)
    next(99)
    첫번째 observer == next(99)
    두번째 observer == next(99)
    next(999)
    첫번째 observer == next(999)
    두번째 observer == next(999)
    next(9999)
    첫번째 observer == next(9999)
    두번째 observer == next(9999)

    🍙 BinderがRxCococoからRxSwiftに移動(RxSwift 6リリース)


    Binderはその名の通りBinding inputまたはoutputのために使用されますその間、Binderを使用するためにRxCocoaモジュールをインポートする必要があります.
    コミュニティの多くの要件に基づいて、RxCocoaモジュールのBinderをRxSWIFTに移動します.RxSwift 6から、Binderを使用するためにRxCocoaモジュールをインポートする必要はなくなりました.

    Drive , Bind


    簡単なUIの変化(ビュー遷移やAlertなど)に対して、ドライブは良い選択のようです.