[RxSwift] Scheduler 제대로 알아보기

내가 이해를 못해서 알아본 observeOn과 subscribeOn

이승연
5 min readMay 13, 2019
Photo by Curtis MacNewton on Unsplash

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을 모두 사용한 예시이다. 천천히 살펴보자.

  1. .observeOn() 로 그 다음에 오는 subscribe 안의 스케줄러를 main 스케줄러로 지정해줌.
  2. .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

굉장히 많은 도움이 된 블로그였다. 아직 이해가 안되신 분들은 이 블로그 글을 읽으면 이해가 될 것이라고 생각한다.

혹시 잘못된 점이 있으면 꼭 알려주시면 감사하겠습니다.

--

--

이승연
이승연

Written by 이승연

👩‍💻 세상의 모든 에러를 경험하는 중. Github pages: https://sweepty.github.io / Github: https://github.com/sweepty

No responses yet