오늘은 Driver와 Signal에 대해서 정리를 해보려고 합니다!
종종 보이는 녀석인데 약간 습관처럼(?) 사용은 해도 왜 사용하지?에 대해서는 생각해 본 적이 없더라구요 ㅎㅎ;;
Driver
RxSwift를 사용해서 테이블뷰 혹은 컬렉션뷰를 만들 때 보통 이렇게 사용을 할 겁니다!
asDriver()는 어떤 역할을 하는 메소드일까요?
정의된 메소드를 타고 들어가보면 이런 식으로 구현이 되어 있습니다
아아닛?!
asObservable이 보입니다!
그냥 Observable에 asObservable 한 것에 .observe(~)를 한 것이 Driver인 것 같네요
여기서 중요한 것은 저기 보이는 DriverSharingStratergy.scheduler 입니다
잘 모르겠지만 scheduler를 다루나봐요!
역시 모를 땐 타고 들어가는 게 최고!
scheduler를 찾았더니 이번엔 SharingScheduler.make()라는 친구가 보이네요?
한 번 더 타고 들어가 봅시다!
후... 드디어 찾았네요...
결국 DriverSharingStratergy.scheduler는 Observable의 쓰레드를 메인 쓰레드로 바꿔주는 역할을 하고 있었어요!
네! asDriver()는 Observable이 Main Thread에서 동작하도록 보장해주는 메소드였습니다! 두두둥
Driver
자 그럼 Driver는 무엇일까요?
도라이버? 죄송합니다...
Relay와 마찬가지로 UI를 다룰 때 사용하는 타입입니다!
그렇다면 Relay와의 차이점이 무엇일까요?
Driver는
강제로 쓰레드를 변환하지 않는다면 무조건 MainThread에서 동작이 되게 보장하고,
onComplete()와 onNext() 이벤트만 처리하고 onError()를 반환하지 않습니다!
이것이 Relay와의 큰 차이점 입니다.
Signal
Driver를 알았다면 Signal은 거져먹기 입니다(?)
Driver가 Behavior라고 생각하면, Signal은 Publish입니다!
즉, Singal은 구독 이후부터 방출되는 이벤트를 얻을 수 있습니다. (Driver는 구독 이전의 최신 이벤트방출)
나머지는 Driver와 같습니다
메인 스레드에서의 동작을 보장한다!
사실 observeOn() 메소드를 사용하여 강제로 스레드를 변경할 수 있지만, 당연히 권장되지 않습니다.
그렇기 때문에 특히 Driver의 경우에는 구독 시점의 스케줄러가 중요합니다.
왜냐하면! Driver는 구독 이전의 이벤트를 방출하기 때문에 그 이벤트가 다른 스케줄러에서 동작할 수도 있기 때문입니다.
음... 이벤트의 스케줄러와 구독시점의 스케줄러가 달라질 수 있다는 소리! 입니다
아마 당신은 이 그림을 본 적이 있을 겁니다(?)
마블 다이어그램과 비슷하죠?
Driver를 구독하게 되면 구독 이전의 가장 최근 이벤트를 받습니다(b)
Signal을 구독하게 되면 구독 이후에 방출되는 이벤트를 받습니다(c)
너무 의식의 흐름대로 정리를 해서 잘못된 부분이 있을 수도 있습니다...
댓글로 가차없이 혼내주세요!
'iOS > RxSwift' 카테고리의 다른 글
RxSwift - 기본 개념 맛보기 (0) | 2022.04.20 |
---|