티스토리 뷰

RxSwift

[RxSwift] subscribe, observe / Scheduler 관리

Hani_Levenshtein 2021. 7. 11. 13:23

안녕하세요 Hani입니다.

이번에는 observe, subscribe에 대하여 알아보겠습니다.

 

 

코드를 한 번 살펴보죠 🧐

위 코드는 Observable이 생성(generate)되고 소멸(dispose)되기까지의 뼈대입니다.

 

첫째 줄에 create operator가 등장했는데

이렇게 Observable을 반환하는 operator가 호출됐다고 해서 Observable이 바로 생성되는 것은 아닙니다.

단지 Observable이 어떻게 생성될지 정의한 것뿐입니다. 🥺

 

 

 

그럼 map, filter등의 operator를 적용하면 생성되나?

 

아니 🔥

 

아니 그럼 언제 Observable이 생성되는데? 😡

 

그 언제는 바로 subscribe operator가 Observable에 적용될 때,

즉, Observer가 Observable을 subscribe하기 시작한 시점입니다.

 

 

Observable이 생성된다는 것은 subscribe closure (create의 클로저 안에 있는 코드)가 실행된다는 의미입니다.

 

그런데 이 클로저들은 어디서 실행될까요?

기본적으로 closure는 current thread/scheduler에서 실행됩니다.

dispose역시 동일한 thread/scheduler에서 일어납니다. 

 

 

RxSwift는 코드가 실행될 곳을 정하는 두 가지 operator를 제공하는데 👍

 

 

subscribe(on: ) 먼저 알아보겠습니다.

subscribe(on: )는 subscribe closure가 실행될 곳을 정합니다.

두 개 이상의 subscribe(on: )을 사용하면 처음 사용한 것만 적용이 됩니다.

 

순서를 바꿔서 사용하면?

  .subscribe(on: ConcurrentDispatchQueueScheduler(qos: .background))에만 영향을 받아서

전부 UI Thread가 아닌 곳에서 코드가 동작합니다.

 

subscribe(on: )에 의해 정해진 thread/scheduler는 바꾸지 않으면 계속 바뀌지 않습니다.

 

이를 바꾸는 operator인 observe(on: )를 알아보겠습니다.

subscribe(on: )에 의해 subscribe closure에서 false가 출력되었습니다.

 

observe(on: )은 호출된 이후 시점의 thread/scheduler에만 영향을 주는데,

map operator 이전에 첫 번째 observe(on: )로 UI Thread로 변경되었기 때문에 map closure에서 true가 출력되고,

map operator 이후에 두 번째 observe(on: )로 Background Thread로 변경되었기 때문에 observe closure에서 false가 출력되었습니다.

 

 

이를 통해 알 수 있는 것은

subscribe(on: )은 어디서 호출되어도 결과가 같으며, 맨 처음 Thread/Scheduler에 관여한다.

observe(on: )은 호출된 곳 다음부터 영향을 주기 때문에 호출 위치에 따라 결과가 다르다. 

 

 

 

 

정리 🔥

1. create() -> subscribe() -> create {} -> ~~~ -> subscribe {} 순으로 호출

 

2. create(), subscribe()은 current thread/scheduler에서 호출된다.

 

3-1. Operator chain에서 subscribe(on: )이 있으면 create {}는 subscribe(on: )이 정한 곳에서 호출된다.

3-2. subscribe(on: )이 없으면 create {} 는 subscribe()이 호출된 곳에서 호출된다.

3-3. 여기서 정해진 thread/scheduler은 observe(on: )이 나오기 전까지 유지된다.

 

4. observe(on: )이 등장하면 다음부터 observe(on: )이 정한 thread/scheduler에서 Observable은 전개한다.

 

 

 

 

 

요즘 글쓰는데 맞는지 안 맞는지 확신이 잘 안 서네요.. 🥺


References

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/GettingStarted.md#creating-your-own-observable-aka-observable-sequence

http://rx-marin.com/post/observeon-vs-subscribeon/

 

 

댓글