Sharing
๐ฅ Sharing Operators โ share
, replay
, multicast
share
, replay
, multicast
โHot์ผ๋ก ๋ง๋ค๊ณ , ๊ตฌ๋ ์๋ฅผ ์ค์ธ์๋ผ.โ
Sharing ๊ณ์ด ์คํผ๋ ์ดํฐ๋ Cold Observable์ Hot์ผ๋ก ๋ณํํ๊ฑฐ๋, ์ด๋ฏธ Hot ์คํธ๋ฆผ์ ๊ตฌ๋ ์ ๊ฐ ํจ์จ์ ์ผ๋ก ๊ณต์ ํฉ๋๋ค. ๋คํธ์ํฌ ์ค๋ณต ํธ์ถ ๋ฐฉ์ง, โUI ์ค๋ณต ์ ๋ฐ์ดํธ ๋ฑ์์ ํ์์ ๋๋ค.
1๏ธโฃ share() โ ๊ฐ์ฅ ๊ฐ๋จํ Multicasting
let shared = api.fetchItems()
.share()
shared.subscribe(...)
shared.subscribe(...)
share()
=multicast(subject: PublishSubject()).refCount()
.์ฒซ ๊ตฌ๋ ์ ์์ค Observable ๊ตฌ๋ , ๋ชจ๋ ๊ตฌ๋ ํด์ ๋๋ฉด ์๋ dispose.
Default
replay:0
,scope:.whileConnected
.
ํ๋ผ๋ฏธํฐ
replay
0
์บ์ํ ์ต์ ์ด๋ฒคํธ ๊ฐ์
scope
.whileConnected
.forever
์ค์ ์ ์ฒซ ์ฐ๊ฒฐ ํ ๊ณ์ Hot ์ ์ง
.share(replay:1, scope:.forever) // Behavior-like Hot Cache
2๏ธโฃ replay(_:) โ ์ง์ ๊ฐ์ Replay ํ ์๋ Connect
let hot = coldObservable
.replay(1) // ์ต์ 1๊ฐ ์บ์
hot.connect() // ์๋ ์ฐ๊ฒฐ
publish().refCount()
ํจํด๊ณผ ๋ฌ๋ฆฌ ๋ฒํผ ์ง์..connect()
์๋ ํธ์ถ or.autoconnect()
.
3๏ธโฃ multicast(subject:) โ ์์ ์๋ ์ ์ด
let subject = PublishSubject<Int>()
let multicasted = coldObservable.multicast(subject: subject)
multicasted.subscribe(...)
multicasted.connect()
์ํ๋ Subject ํ์ ์ง์ (e.g.,
ReplaySubject
,BehaviorSubject
).connect/dispose๋ฅผ ์ธ๋ถ์์ ์ ์ดํด์ผ ํจ.
4๏ธโฃ Hot ๋ณํ Flowchart
Cold
โ share() (auto connect)
โผ
Hot (PublishSubject)
โ replay(โฆ) (auto connect)
โผ
Hot + Cache
โ multicast() (manual connect)
โผ
Custom Hot (Behavior/Reโฆ)
5๏ธโฃ ์ค์ ํจํด
A. ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ์บ์ฑ
func loadImage(url: URL) -> Observable<UIImage> {
URLSession.shared.rx.data(request: URLRequest(url: url))
.map(UIImage.init)
.share(replay: 1, scope: .forever)
}
B. BLE ์ผ์ ์ค์๊ฐ ์คํธ๋ฆผ ๊ณต์
bleManager.rx.sensorData()
.share()
.bind(to: chart, logger, fileWriter)
C. Splash ๋ณ๋ ฌ API ํธ์ถ โ merge
Observable.merge(api.a().share(), api.b().share())
6๏ธโฃ Pitfalls & Tips
share()
์scope:.whileConnected
๋ ๋ชจ๋ ๊ตฌ๋ ์ข ๋ฃ ์ ์ฌ์์ โ ๊ธฐ์ตํ์.memory:
replay
๊ฐ์ด ํฌ๋ฉด ์บ์ ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ โ ํ์ ์์๋ง.Driver
/Signal
(RxCocoa) ๋ด๋ถ๋share(replay:1)
์ฌ์ฉ.
7๏ธโฃ Mini Quiz
share(replay:1, scope:.whileConnected)
๊ณผreplay(1).refCount()
์ฐจ์ด?Hot Observable์ ๋ค์ Cold๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์?
Subject๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ์ง ์๊ณ multicast๋ฅผ ์ฐ๋ ์ฅ์ ?
๋ค์ โถ๏ธ memoryManagement.md ๋ก ์ด๋ํด DisposeBagยทleak ์๋ฐฉ ์ ๋ต์ ์ฌํํฉ๋๋ค. ๐
Last updated