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와 사용하는 편이구요
딱 이렇게 사용한다 답은 잘 모르겠어요
명시적으로 '이것은 어디에 사용하는 것이다' 를 알 수 있게끔 하기위해서
구분지어서 사용하려고 노력하고 있어요
혹시 잘못알고있거나 좋은 의견 피드백부탁드려요 :)
'iyOmSd > Title: RxSwift' 카테고리의 다른 글
[RxSwift] ReactorKit 체험 (Hello ReactorKit) (0) | 2021.03.25 |
---|---|
[RxSwift] Observable? Driver? Relay? 알아보기 (0) | 2020.10.28 |
[RxSwift] Observable, Subject, Relay (0) | 2020.06.27 |
[RxSwift] TableView 구현하기 (0) | 2020.06.05 |
[RxSwift] Combine Operator정리 - CombineLatest, Merge, Zip (0) | 2020.05.30 |