RxSwift - RxCocoa

JSLee·2022년 3월 18일
0

RxCocoa


RxCocoa란 기존 Cocoa Framework에 Rx기능을 합친 RxSwift기반의 라이브러리 입니다.

RxSwift와 별도로 추가해주어야 사용할 수 있습니다

RxCocoa는 단방향성을 갖고 있습니다

Producer는 값을 생성하고, Consumer는 값을 처리 합니다.


ObserverType,ObservableType

두개의 Type 성질을 알고 이해해야 합니다.

  • observableType : 값을 관찰할수 있습니다.

  • observerType : 값을 주입시킵니다.


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 구현 자체에서도 subscrbie 를 사용하고 있습니다.

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

RxCocoa bind 는
Observable 과 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)

이처럼 UI를 Controll 하는데 있어 Rxcocoa 를 사용하는것이 조금더 우위에 있습니다.(가독성 등에도 차이가 있는듯 하다).

또한 값을 주입하기 때문에 순환참조에서도 벗어날수 있습니다.

bind 는 binder 되어 있는 Property의 값을 전달받아 주입하기 때문에 따로 메모리릭에 대비하지 않아도 됩니다.

Traits

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

  • error를 방출하지 않습니다

  • MainScheduler 에서 subscribe 됩니다.
    (scheduler 를 통한 Thread 지정할 필요없습니다)

  • signal 을 제외한 나머지들은 자원을 공유합니다


Trait 종류

ControlProperty (ObservableType,ObserverType)
Subject 와 비슷합니다.

  • 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)



ControlEvent( ObserverType )

  • 컨트롤의 event를 수신하기 위해 사용합니다.
  • MainScheduler 에 전달합니다.

  • Observable 의 역할을 수행하지 못합니다.

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

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

Dirver

  • error 를 전달하지 않습니다.

  • Scheduler 를 통한 Thread 변경이 되지 않는 이상 MainThread 에서 작업 됩니다.

  • Observable share 를 통한 공유처럼 공유가 가능합니다.

  • 구독이 이루어지면 가장 최근에 발생한 Event 가 전달된다.

선언에 대하여

        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)

profile
iOS/Android/FE/BE

0개의 댓글