본문 바로가기
iOS/RxSwift

[RxSwift] RxCocoa (binding, Traits, Driver..등)

by 최지철 2023. 11. 4.
728x90
반응형

RxCocoa

  • RxCocoa란 기존 Cocoa Framework에 Rx기능을 합친 RxSwift기반의 라이브러리
  • RxSwift와 별도로 추가해주어야 사용할 수 있다
  • RxCocoa는 단방향성을 갖고 있다
  • Producer는 값을 생성하고, Consumer는 값을 처리 한다.

ObserverType, ObservableType

  • observableType : 값을 관찰할수 있습니다.
  • observerType : 값을 주입시킵니다.


Binding

  • 데이터 생산자와 소비자가 존재( 생산자 = Observer, 소비자  = UI Component)
  • 생산자가 생성한 데이터를 소비자에게 전달하고 소비자가 데이터를 소비한다

Binder

  • 소비자 역할 observerType
  • Observable이 아니기 때문에 구독자 추가 X
  • Error 이벤트 받지않는다

Observable → Next ✅  → Binder

Observable → Completed ✅  → Binder

Observable → Error ❌  → Binder

 

bind 는 subscribe 와 동일한 기능이라고 말할수 있다.
실제 bind 구현 자체에서도 subscrbie 를 사용하고 있다.

하지만 조금 다른점은 RxSwift 에서의 subscribe 는
Observable 이 방출하는 Event 를 Observer 가 subscribe 하여 관찰 할 수 있다.

RxCocoa bindObservable 과 Observer 의 관계를 하나로 묶는 다는 개념.

     textfield.rx.text
            .bind(to: lb.rx.text)
            .disposed(by: disposBag)

 

 

Traits

RxCocoa의 Trait(UI작업시 코드를 쉽고 직관적으로 작성해 사용할 수 있도록 도와주는 특별한 Observable클래스 모음)

  • error를 방출하지 않는다
  • MainScheduler 에서 subscribe 된다 (scheduler 를 통한 Thread 지정할 필요가 없다)
  • signal 을 제외한 나머지들은 자원을 공유한다

종류 

1. ControlProperty (ObservableType,ObserverType)

  • ControlProperty는 ControlPropertyType을 준수하고, ControlPropertyType은 ObservableType과 ObserverType을 준수
  • 컨트롤에 data를 binding하기 위해 사용합(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)

 

2. ControlEvent( ObserverType )

  • 컨트롤의 event를 수신하기 위해 사용합니다.
  • MainScheduler 에 전달합니다.
  • Observable 의 역할을 수행하지 못합니다.

Driver : error를 방출하지 않고 메인스레드에서 처리

Signal : Driver와 유사하지만 자원을 공유 하지 않는다. (Signal은 event모델링에 유용, Driver는 state모델링에 더 적합)

 

Driver

  • error 를 전달하지 않는다.
  • Scheduler 를 통한 Thread 변경이 되지 않는 이상 MainThread 에서 작업 
  • Observable share 를 통한 공유처럼 공유가 가능.
  • 구독이 이루어지면 가장 최근에 발생한 Event 가 전달된다.

 

       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)

도움이 될만한표

728x90
반응형