Swift - RxCocoa



RxCocoa



RxCocoaは、RxSwiftベースのライブラリであり、既存のCocoaフレームワークとRx機能を結合しています.
使用するにはRxSWIFTを別途追加する必要があります
RxCocoaは一方向性を有する
Producerは値を生成し、Consumerは値を処理します.

ObserverType,ObservableType


2つのタイプの性質を理解し、理解する必要があります.

  • 観測可能タイプ:観測可能値.

  • MobserverType:値を入力します.
  • Binder


    まずbindを理解するにはBinderを理解しなければならない.

    Binderは光ファイバタイプで3つの特徴があります.
  • は、プライマリ・スケジューラで実行する必要があります.
  • はログのみを出力し、エラーイベントは解放されません.
  • 傍観者タイプなので、新しい値を渡すことができますが、購読者を追加することはできません.
  • bind

    public func bind<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element {
            self.subscribe { event in
                observers.forEach { $0.on(event) }
            }
        }
    bindはsubscribeと同様の機能といえる.
    実際のbind実装自体もsubscribeを用いる.
    でもちょっと違う
    RxSWIFT上のsubscribe
    傍観者は、可視的に放出されたイベントを購読し、観察することができる.
    RxCocoa bindは
    ObserverとObserverの関係を組み合わせます.
    コード差異

    subscribe

           tf.rx.text
                .observe(on: MainScheduler.instance)
                .subscribe(with: self , onNext:  { ( _ , str ) in
                    self.lb.text = str
                }).disposed(by: disposBag)

    bind

         tf.rx.text
                .bind(to: lb.rx.text)
                .disposed(by: disposBag)
    Rxcocaを使用してUIを制御するメリットはさらに大きい.(可読性などにも差がある).
    また、値を注入することで循環参照を回避することもできる.
    bindはバインド属性の値を受け入れて注入するので、メモリ構造の準備は必要ありません.

    Traits


    RxCocoaのTrait(UIを使用するときにユーザーがコードを簡単に直感的に作成し、使用できる特殊な観察可能クラスのセット)

  • errorを解放しない

  • MainSchedulerによって購読されます.
    (スケジューラでThreadを指定する必要はありません)

  • 信号を除いて、他の人はリソースを共有しています.
  • Traitタイプ

    ControlProperty (ObservableType,ObserverType)
    Subjectに似ています.

  • 制御属性は制御属性タイプに合致し、制御属性タイプは観測可能タイプと観測可能タイプに合致する.

  • コントロールにデータをバインドします.(rx namespaceを使用)

  • errorを解放しません.
  •         let blue = tf2.rx.text.orEmpty.map { $0.contains("파랑") }
            
            blue
                .distinctUntilChanged() //값이 변경될때만 방출
                .subscribe(with: self,onNext: { _ , value in
                        self.lb.text = String(value)
                }).disposed(by: disposBag)


    ControlEvent( ObserverType )
  • コントロールのイベントを受信するために使用されます.

  • MainSchedulerに転送します.

  • Observableロールを実行できません.
  • Driver:エラーを解放せずにメインスレッドで処理します.
    信号:Driverと似ていますが、リソースは共有されません.(信号はイベントモデリングに役立ち、ドライバはステータスモデリングに適しています.)

    Dirver


  • エラーは転送されません.

  • スケジューラでThreadを変更しない限り、MainThreadで作業します.

  • 共有は観測可能な共有のようなものです.

  • サブスクリプションに成功すると、最近発生したイベントが渡されます.
  • 宣言について
            let result2 = Observable<Int>.of(Int.random(in: 11..<21))
                .observe(on: MainScheduler.instance)
                .catchAndReturn(100)
                .map { String($0) }
                .share()
            
            result2
                .subscribe(with:self,onNext: { _ , str in
                    self.lb.text = str
                }).disposed(by: disposBag)
            
            result2
                .subscribe(with:self,onNext: { _ , str in
                    self.lb2.text = str
                }).disposed(by: disposBag)
    subscribeを使用する場合は、設定する必要があるものがたくさんあります.
           let result = Observable<Int>.of(Int.random(in: 11..<21))
                .asDriver(onErrorJustReturn: 100)
                .map { String($0) }
    
            result
                .drive(lb.rx.text)
                .disposed(by: disposBag)
    
            result
                .drive(lb2.rx.text)
                .disposed(by: disposBag)