[RxSwift] Scheduler 제대로 알아보기
RxSwift를 공부하고 사용하면서 가장 헷갈렸던 Scheduler에 대해서 정리해보고자 한다.
Scheduler 제대로 알아보기
공식 문서에서 말하기를…
If you want to perform work on a different scheduler just use observeOn(scheduler)
operator.
If you want to start sequence generation (subscribe method) and call dispose on a specific scheduler, use subscribeOn(scheduler)
.
즉, 작업 수행을 다른 스케줄러에서 하고 싶다면 observeOn(scheduler)
를 사용하고, sequence 생성과 dispose call을 특정 스케줄러에서 하고 싶다면 subscribeOn(scheduler)
를 사용하라는 것이다.
이렇게 observeOn을 사용해서 그 다음에 오는 map이 작업할 스케줄러를 바꿔줄 수 있다. 첫번째 map은 backgroundScheduler
위에서 작업을 할 것이고, 두번째 map은 MainScheduler
위에서 작업을 할 것이다.
음 알겠어… observeOn은 예제에서 많이 봐서 뭔지 알겠는데… subscribeOn은 아직 이해가 안가… 그리고 왜 갑자기 sequence 생성이 나오는거지? 🤔
Sequence 생성??
나름 RxSwift에 대해서 좀 알고 있다고 생각했는데 내가 놓친 점이 있었다.
Sequence generation starts when subscribe method is called.
Sequence 생성은 subscribe가 호출될 때 시작됩니다!
subscribe가 호출되기 전까지 observable은 선언만 된 상태이기 때문에 어떤 event도 일어나지 않는다.
subscribe가 호출되어야만 observable이 생성되는 것이다.
아래는 create로 observable을 생성하고 subscribe를 호출한 코드이다.
subscribeOn은 Sequence가 생성될 때(=subscribe()가 호출될 때)의 스케줄러를 지정하는 것이다.
위 코드에서는 .create
. 클로저가 subscribeOn의 영향을 받고 subscribe는 observeOn의 영향을 받는다. 이름 때문에 헷갈릴 수도 있지만 subscribeOn이 subscribe 자체에 영향을 주는 게 아니라는 것을 명심해야한다.
observeOn과 subscribeOn을 모두 사용한 예시이다. 천천히 살펴보자.
.observeOn()
로 그 다음에 오는 subscribe 안의 스케줄러를 main 스케줄러로 지정해줌..subscribeOn()
로 observable이 생성되는 스케줄러를 background로 지정해줌.
3. .subscribe()
가 호출되었을 때 onNext 이벤트가 발생하고 이 이벤트를 subscribe에서 받아서 출력하므로 다음과 같이 출력됨.
onNext 1 true
onNext 2 true
4. Hi 는 observable이 생성되는 곳에 있으므로 다음과 같이 출력됨.
Hi false
실전 예시
실제 사례로 쓰일 법한 예제를 보고 다시 이해해보자.
결론
observeOn
operator(map, filter, etc)와 subscribe 작업을 다른 스케줄러에서 사용하고 싶을 때 사용.
subscribeOn
observable을 특정 스케줄러에서 생성하고 싶을 때 사용.
References
굉장히 많은 도움이 된 블로그였다. 아직 이해가 안되신 분들은 이 블로그 글을 읽으면 이해가 될 것이라고 생각한다.
혹시 잘못된 점이 있으면 꼭 알려주시면 감사하겠습니다.