티스토리 뷰
안녕하세요 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
http://rx-marin.com/post/observeon-vs-subscribeon/
'RxSwift' 카테고리의 다른 글
[RxSwift] Operator, Combining Observables (0) | 2021.07.15 |
---|---|
[RxSwift] Operator, Transforming Observables (0) | 2021.07.15 |
[RxSwift] Closure ARC / Memory Leak 실험 (0) | 2021.07.10 |
[RxSwift] Subject (0) | 2021.07.07 |
[RxSwift] Operator, Filtering Observables (0) | 2021.07.01 |
- Total
- Today
- Yesterday
- 강한 순환 참조
- 부스트캠프 6기
- WWDC16
- 에드몬드 카프 알고리즘
- test coverage
- mach-o
- CPU와 Memory
- 최단경로문제
- 네트워크 유량
- 벨만포드 알고리즘
- IOS
- CompositionalLayout
- WWDC21
- WWDC17
- MeTal
- Testable
- 컴퓨터 추상화
- 다익스트라 시간복잡도
- 포드 풀커슨 알고리즘
- 최대 매칭
- 벨만포드 시간복잡도
- 코딩대회
- State Restoration
- HIG
- WWDC19
- 최단경로 알고리즘
- rxswift
- 네트워크 플로우
- observeOn
- 최단경로 문제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |