본문 바로가기

개발/RxSwift

[RxSwift] bind, driver, relay

반응형
 

GitHub - ReactiveX/RxSwift: Reactive Programming in Swift

Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.

github.com

 

RxSwift 6.1 


Bind

Bind와 Driver 모두 메인 스케줄러에서 실행되며 에러 이벤트를 따로 방출하지 않는다.
UI와 관련된 operator이며 UI와 Observable을 하나로 묶는다.

에러를 뱉지 않기 때문에 UI 핸들링으로 활용하는 것이 적합하다!

bind를 사용하게 되면 아래와 같이 방출한 이벤트 그대로를 label의 텍스트와 bind 한다.
Observable을 구독하는 옵저버가 늘어날 때마다 스트림도 함께 늘어난다.
RxSwift 6 부터 Bind는 RxSwift에 포함된다.

button
    .rx
    .tap
    .bind(with: self, onNext: { owner, _ in 
    	owner.handleButton()
    })
    .disposed(rx.disposed)
    
// + 중복 방지 클릭
button
    .rx
    .tap
    .throttle(.milliseconds(300), scheduler: MainScheduler.asyncInstance)
    .bind(with: self, onNext: { owner, _ in 
    	owner.handleButton()
    })
    .disposed(rx.disposed)

 

 

Driver

스트림 공유가 가능해서 driver 객체를 구독하는 옵저버가 늘어나도 스트림은 하나로 유지된다.
이 스트림을 공유해서 각자의 작업을 진행한다.
Driver는 MainThread로 지정되어있기 때문에 UI 단에서 활용하기 좋다.
Signal은 Driver과 거의 동일하나 자원을 공유하지 않는다.

viewModel.output.sendCode
    .asDriver(onErrorDriveWith: .empty())
    .drive(with: self, onNext: { owner, res in
        owner.pushVerifyCodePage(res: res)
    })
    .disposed(by: rx.disposeBag)

+ asDriver 
평범한 Observable을 Driver로 바꾸어서 사용할 수 있다. 
MainThread 에서 실행되며 에러를 방출하지 않고 공유 가능한 속성으로 변경한다.
ex.) asDriver(onErrorDriverWith:): error를 수동적으로 리턴하여, error에 이벤트를 handle할 수 있다.
ex.) asDriver(onErrorRecover:): driver에 사용되며 error에 대한 이벤트를 handle할 수 있다.

 

Relay

RxCocoa에서 제공하는 UI이벤트를 쉽게 구현하고 처리할 수 있으며 RxCocoa의 클래스이다.
Relay는 onError, onCompleted를 할 수 없으며 dispose에서만 작동이 끝난다.
즉, Relay는 받아들인 데이터를 onError, onCompleted 없이 항목을 방출한다.

 


 

PublishRelay

PublishSubject의 Wrapper 클래스이며 구독 이후의 이벤트만 알 수 있다.
.accept 함수가 subject의 onNext()를 역할을 대신하며 값을 세팅할 수 있다.
error 나 completed에 종료되지 않으며 dispose로 해제된다.

let publishRelay = PublishRelay<Int>()
publishRelay.accept(1)
publishRelay.accept(2)

publishRelay.subscribe { print($0) }
publishRelay.accept(3)

// next(3)

 

BehaviorRelay

BehaviorSubject의 Wrapper 클래스이며 .value를 통해 최근 값을 가져올 수 있다.
.accept 함수가 subject의 onNext()를 역할을 대신하며 값을 세팅할 수 있다.
error 나 completed에 종료되지 않으며 dispose로 해제된다.

let behaviorRelay(value: [1])	  
// value = [1]

behaviorRelay.accept(behaviorRelay.value + [2])  
// value = [1, 2]

 

ReplayRelay 

ReplaySubject의 Wrapper 클래스이며 RxSwift 6에 추가되었다.

ReplayRelay<Int>.create(bufferSize: 5)

 


RxSwift의 Trait 차이점

RxSwift의 Traits는 Single, Completable, Maybe 로 구성된다.
이들은 bind, drvier, relay와 달리 완료된 이벤트 또는 에러를 방출한다. 
배출 가능한 이벤트가 다르기 때문에 UI단에서 사용하는 bind, drvier, relay와 달리
Traits는 응답값이 중요한 API나 로직 단에서 주로 사용된다.

 

반응형