iyOmSd/Title: RxSwift

[RxSwift] bind, subscribe, drive

냄수 2020. 10. 3. 23:54
반응형

Rx를 사용하다보면 헷갈리는 용어들과 언제 사용해야 맞는 건지 등등

사용법은 비슷한데 다른 API들이 있어요

 

우선 사용하면서 느낀게 bind, subscribe, drive가 있었어요

각 개념들을 정리해보고 생각해 볼까요?

 

제일 기본적인 subscribe

되게길죠..? ㅎ...

 

대부분 구독한다라는 뜻으로 알고 사용해요

한 대상이 있고 subscribe를 하면

그 대상의 상태가 변하면 그 값을 받아 와서 처리할 수 있는 개념이에요

 

구독대상의 변하는 다음값, 에러시, 끝날시의 때를 알고 코드를 구현 할 수 있죠

 

 

 

다음은 bind

내부적으로는 subscribe를 사용하고 있네요

onNext만 매개변수로 받아서 사용하구요

따라서

subscribe에서 error컨트롤을 못 할 것 같죠??

 

단순히 새로 생성되는 값을 넘겨줄 때 간편하게 쓰는 용도로 쓰일것 같아요

 

 

 

다음은 drive

drive도 보면 내부적으로 subscribe를 쓰고있어요

그럼 bind와 다른게 뭔가...?!

 

우선 무조건 Main Scheduler 즉 Main Thread에서 동작해요

 

같은코드가있다면

viewModel.output.isLoading
    .asDriver()
    .drive(onNext: { [weak self] in
        self?.indicatorView.isHidden = !$0
    })
    .disposed(by: disposeBag)
    
/* 위와 아래는 같은 동작 코드 */

viewModel.output.isLoading
    .observeOn(MainScheduler.instance)
    .subscribe(onNext: { [weak self] in
        self?.indicatorView.isHidden = !$0
    })
    .disposed(by: disposeBag)

이렇게 될 수 있겟죠

우선 drive를 사용하기위해서는 asDriver()를 통해서 Driver타입으로 만들어줘야해요

또한 사용하기위해서는 BehaviorRelay형태여야하구요

 

물론 BehaviorRelay가 BehaviorSubject를 wrapping한 형태라서

BehaviorSubject도 asDriver가 있어요

하지만 BehaviorSubject는 에러가 날 수 있는 경우가 있기때문에

에러가 없는 Driver형태와는 안맞겠죠??

에러가 나도 진행할 수 있도록 에러가 날때의 동작을 추가해서 만들수 있어요

위에서 보는거와 같이 Main Scheduler로 변경되서 사용되는거를 볼수 있죠

따라서 drive를 사용하면 Main Thread를 사용한다 명시할 수 도 있고 코드가 간결해질거에요

 

 

저는 drive는 UI에 관련된 코드를 작성할 때 쓰는 편이에요

Relay와 drive를 통해서 안전하게 사용하고 있어요

 

값을 사용하기위해 저장할때는 bind나 subcribe를 Subject와 사용하는 편이구요

 

딱 이렇게 사용한다 답은 잘 모르겠어요

명시적으로 '이것은 어디에 사용하는 것이다' 를 알 수 있게끔 하기위해서

구분지어서 사용하려고 노력하고 있어요

 

혹시 잘못알고있거나 좋은 의견 피드백부탁드려요 :)

 

 

 

반응형