iOS/RxSwift
[RxSwift] RxCocoa (binding, Traits, Driver..등)
최지철
2023. 11. 4. 14:47
반응형
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 bind 는 Observable 과 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)
도움이 될만한표
반응형