Variable , Driver, ControlProperty
* 이 포스트는 RxSwift 4.3.1, swift 4.2 버전을 기준으로 작성되었습니다.
* 관련 원문: https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Units.md
iOS 에서 UI 이벤트를 구성하기 위해 주의해야 할점은 아래와 같다.
1. 에러를 발생하지 않는다.
2. 메인스케쥴러에서 동작해야 한다.
3. 사이드 이펙트를 공유한다.
2번은 iOS 개발자라면 익숙한 부분이고, 1과 3은 처리에 관한 이야기로 UI이벤트로 에러를 전달하면 안된다는 내용과 같다.
RxSwift 에서는 위와 같은 상황에서 쉽게 속성에 맞게 동작 할 수 있도록 Driver 를 제공한다.
Driver 유닛의 특징은 그래서 위의 내용을 충족한다.
Can't error out
Observe on main scheduler
Sharing side effects (shareReplayLatestWhileConnected)
예제
아래와 같이 백그라운드에서 이벤트를 발생하는 Observable 이 있다.
이벤트가 발생하면 UILabel에 해당값을 보여주려한다.
UI이벤트는 메인스레드에서 동작해야 하고, 에러 시퀀스가 발생하면 처리해주는 코드도 필요하다.
위의 조건에 맞도록 observable 을 아래와 같이 구성했다.
let observable = Array(0...5).toObservable().observeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
observable.observeOn(MainScheduler.instance)
.catchErrorJustReturn(-1)
.shareReplayLatestWhileConnected()
메인스레드에서 동작하도록 하고, 에러처리를 해주었으며, subscription 을 공유하도록 했다.
observable.asDriver(onErrorJustReturn: -1).asObservable()
이를 driver 를 사용하면 위와 같이 만들면 된다.
( driver 내부에서 shareReplayLatestWhileConnected 가 적용된다. )
RxSwift 4.0 에서 Variable 이 deprecated 목록에 추가되었다.
BehaviorRelay 를 사용하자.
개념은 Variable 과 동일하다. Variable과 마찬가지로 BehaviorSubject 를 사용한다. 한번더 랩핑 해주었다.
BehaviorSubject 와 다른점은 에러나 Completed 로 종료되지 않는다.
variable 객체는 BehaviorSubject 를 wrap 한 클래스 이고, 에러를 발생하지 않는다.
BehaviorSubject 와 같이 값이 저장되어 사용되며, 이것을 UI 와 연결하고 싶을때 사용하면 된다.
variable 객체는 asdriver 를 통해 driver unit 으로 변경이 가능하다.
tableview, collectionview 등에서 viewmodel 을 datasource 에 바인딩 할때 주로 혼합되어 사용된다.
이제 rxswift 의 각종 메서드들에 대해서는 한번씩 다룬것 같다.
다음 포스트에서는 hot, cold 옵저버블의 차이점에 대해 정리해보려한다.