์ด๋ฆ์ ์กฐ๊ธ ๋ค๋ฅด์ง๋ง ์ด๋ ๊ณณ์์ ์์ ํ ์ง(main, global) ์คํ ํ๋ฆ์ ์์น๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ์ ๋งํฉ๋๋ค.
๊ธฐ๋ณธ swift์์๋ thread ์์
์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด GCD๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. RxSwift์์ GCD์ ๋์๋๋ ๊ฐ๋
์ด Schedular๋ผ๊ณ ํ ์ ์์ต๋๋ค.
Schedular๋ฅผ ํตํด Observable์ ์ด๋์ ์์ฑํ ์ง, Observer๊ฐ ์ด๋์ ๊ด์ฐฐํ ์ง ์ง์ ํด ์ค ์ ์์ต๋๋ค.
observeOn ๊ณผ subscribeOn์ ์ค์ผ์ค๋ฌ๋ก ์๋๋๋ ๋ํ์ ์ธ ๋ ์ฐ์ฐ์์ ๋๋ค.
observeOn๊ณผ subscribeOn
๋์ ์ฐจ์ด๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ๋๋ฐ ์์ด
http://rx-marin.com/post/observeon-vs-subscribeon/
observeOn vs. subscribeOn
How to subscribe and observe on different threads
rx-marin.com
์ด ๊ธ์ ์ฐธ๊ณ ํ์ต๋๋ค (์ค๋ช ์งฑ ๐๐)
observeOn๊ณผ subscribeOn์ ์์ ๋ฅผ ๋ณด๊ธฐ ์ ์ observable์ด subscription ๋๋ ํ๋ฆ์ ๋จผ์ ์ดํด๋ด
์๋ค.
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด 3๋จ๋ฝ์ผ๋ก ๊ตฌ๋ถ ํ ์ ์์ต๋๋ค.
- observable์ ์ ์ํฉ๋๋ค. observable์ create๋ก ์์ฑํ ๋ ์ด๊ฒ์ ์์ง ์์ฑ๋์์์ ๋ํ๋ด์ง ์์ต๋๋ค. observable๋ subscribe๋์์ ๋ ์์ฑ๋ฉ๋๋ค. ์ด๊ณณ์์ ๋ฏธ๋์ ์ฌ์ฉํ ๊ฐ๋ค์ ์ ์ฅํ๊ณ ์๋ ๊ฒ์ ๋๋ค.
- Map, filter๊ณผ ๊ฐ์ operator์ ์ฌ์ฉํด ๊ฐ์ ๋ฐฉ์ถํฉ๋๋ค. ์ฌ์ ํ ์๋ฌด ์์ ๋ ์คํ๋์ง ์์ต๋๋ค.
- subscribe(…)๋ฅผ ํธ์ถํ ๋ ์คํ์ด ์ด๋ฃจ์ด์ง๋๋ค.
์ฌ๊ธฐ์ ๋๊ฐ์ง ํฌ์ธํธ๊ฐ ์์ต๋๋ค.
Observable.create {} ์ฝ๋๋ (subscription code) subscribe() ๋ฉ์๋๋ก๋ถํฐ ํธ์ถ๋ฉ๋๋ค.
์ด ํจ์๋ subcription์ ๋ง๋ค๊ณ element๋ฅผ ์์ฑํ๋ ์์
์ ์ํํฉ๋๋ค.
subscribe() ์ฝ๋๋ (observation code) ๋ฐฉ์ถ๋ ๊ฐ์ ๊ด์ฐฐํ๋ ๊ณณ์
๋๋ค.
subscribeOn
Subscription code๊ฐ ์คํ๋ ์ค์ผ์ค๋ฌ๋ฅผ ๋ฐ๊พธ๋ ๋ฉ์๋์ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก observable์ ์์ฑ์ subscribe()๋ฅผ ํธ์ถํ ์ค๋ ๋์์ ๋ถ๋ฆฝ๋๋ค.
subscribeOn() ๋ฉ์๋๋ observable์ ์์ฑํ ์ค๋ ๋๋ฅผ ๋ฐ๊ฟ ์ ์๊ฒ ํด์ค๋๋ค.
Observable<Int>.create { observer in
observer.onNext(1)
sleep(1)
observer.onNext(2)
return Disposables.create()
}
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.subscribe(onNext: { el in
print(Thread.isMainThread)
})
์ ์ฝ๋์์ subscribeOn์ด ์ฐ์์ต๋๋ค. subscribeOn์ ์ญํ ์ ๋์
ํด ๋ณธ๋ค๋ฉด
observable()์ด ์์ฑํ ์ค์ผ์ค๋ฌ๋ฅผ ๋ฐ๊ฟ์ฃผ๋๋ฐ, concurrent schedular๋ก background์์ ํ๋๋ก ๋ฐ๊ฟ์ฃผ๊ณ ์๋ค๋ ๋ป์ด๊ฒ ์ฃ ?
[main] subscribe() -> [background] create{ … } -> [background] onNext { … }
์ ์คํ ํ๋ฆ์ ๊ฐ์ง๋ฉฐ false๋ฅผ ์ถ๋ ฅํ ๊ฒ์
๋๋ค.
๋ง์ฝ subscribe() ํจ์ ๋ด์์
.subscribe(onNext: { el in
self.loginButton.isSelected = true
})
์ ๊ฐ์ UI ์์ ์ด ํ์ํ๋ค๊ณ ์๊ฐํด๋ด ์๋ค.. ์๋ ๊ทธ๋ฌ๋ฉด ๋น๊ทผ main ์ค๋ ๋์์ ์๋ํด์ผ ํ๊ฒ ์ฃ ?
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
๋ฅผ ํตํด ์์ ์ ํ๋ฆ์ background๋ก ๋ฐ๊ฟ์คฌ์๊ธฐ ๋๋ฌธ์ ๋ค์ main ์ค๋ ๋๋ก ์ฎ๊ฒจ์ค์ผ ํฉ๋๋ค. ์ด๋ observeOn() ๋ฉ์๋๋ฅผ ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
observeOn()
Observation code๊ฐ ์คํ๋ ์ค์ผ์ค๋ฌ๋ฅผ ๋ฐ๊พธ๋ ๋ฉ์๋ ์ ๋๋ค.
๊ฐ์ ๋ฐฉ์ถํ ๋ ์ค์ผ์ค๋ฌ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค๋ฉด ๋ณดํต observeOn() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ํ๋ฆ์ ๋ฐ๊ฟ์ค๋๋ค.
Observable<Int>.create { observer in
observer.onNext(1)
sleep(1)
observer.onNext(2)
return Disposables.create()
}
.observeOn(MainScheduler.instance)
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.subscribe(onNext: { el in
print(Thread.isMainThread)
})
์ด๋ ๊ฒ ๋๋ค๋ฉด observable์ ์์ฑํ ๋๋ background์์ onNext๋ก ๊ฐ์ ๋ฐฉ์ถํ ๋ main thread์์ ์ฌ์ฉ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
[main] subscribe() -> [background] create{ ... } -> [main] onNext { ... }
subscribOn()์ ์ฌ์ฉํด๋ณธ์ ์ด ์์ด์ observable์ ์์ฑ์ background์์ ํ๋ ๊ฒฝ์ฐ์ ๋ํด ์์ ๋ฅผ ํ๋ฒ ์ดํด ๋ด์ผ ํ ๊ฑฐ ๊ฐ์์ .. ๊ทธ๋ผ ์ด๋ง !!
์ฐธ๊ณ : https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Schedulers.md
GitHub - ReactiveX/RxSwift: Reactive Programming in Swift
Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.
github.com
'IOS๐ > RxSwift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] Filtering Operator (distinctUntilChanged) (0) | 2022.05.10 |
---|---|
[RxSwift] Error Handling Operator (0) | 2022.05.10 |
[RxSwift] Signal, ControlProperty, ControlEvent ๋ ? (0) | 2022.03.21 |
[RxSwift] Driver๋ ? (feat. bind) (0) | 2022.03.21 |
[RxSwift] Traits ์ด๋ (0) | 2022.03.19 |
๋๊ธ