Transforming
๐ Transforming Operators โ ์คํธ๋ฆผ์ โ๋ณํโํ๋ ๋ง๋ฒ
โ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ๋ชจ์ต์ผ๋ก ๊ฐ๊ณตํ๋ผ.โ
Transforming ๊ณ์ด ์คํผ๋ ์ดํฐ๋ Observable์ ๊ฐ ๊ตฌ์กฐยทํ์
ยท๊ฐ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ค์ ๋จ๊ณ์์ ํ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ํนํ map
ยทflatMap
ยทscan
์ Rx์ ์ผ๋์ฅ์ด๋ผ ๋ถ๋ฆด ๋งํผ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
1๏ธโฃ ํต์ฌ ์คํผ๋ ์ดํฐ ์์ฝ
map
์์๋ฅผ 1:1 ๋ณํ
(Element) -> R
compactMap
nil ํํฐ๋ง & ๋ณํ
(Element) -> R?
flatMap
์์๋ฅผ Observable๋ก ๋ณํ ํ ๋ณํฉ
(Element) -> Observable<R>
flatMapLatest
๊ฐ์ฅ ์ต์ ๋ด๋ถ Observable๋ง ๊ตฌ๋ (switch)
same
flatMapFirst
์ฒซ ๋ด๋ถ ์คํธ๋ฆผ ์ง์, ์ดํ ๋ฌด์
same
concatMap
์ด์ ๋ด๋ถ Observable ์๋ฃ ํ ๋ค์ ์คํ
same
scan
๋์ (accumulate) reduce
(Accumulator, Element) -> Accumulator
buffer
์ฃผ๊ธฐยท๊ฐ์ ๋จ์ ๋ฐฐ์ด๋ก ๋ฌถ๊ธฐ
timeSpan,count,scheduler
materialize/dematerialize
Event โ๏ธ Element ๋ณํ
-
2๏ธโฃ ์ค์ ์์
A. map
โ JSON โ Model ํ์ฑ
map
โ JSON โ Model ํ์ฑurlSession.rx.data(request: req)
.map { try JSONDecoder().decode(User.self, from: $0) }
.subscribe(onNext: showUser)
B. flatMapLatest
โ ํ
์คํธ ๊ฒ์ ์๋์์ฑ
flatMapLatest
โ ํ
์คํธ ๊ฒ์ ์๋์์ฑsearchBar.rx.text.orEmpty
.debounce(.milliseconds(300), scheduler: MainScheduler.instance)
.flatMapLatest(api.search) // ์๋ก์ด ํค์๋ ์
๋ ฅ ์ ์ด์ ์์ฒญ ์ทจ์
.bind(to: tableView.rx.items(...))
C. scan
โ ์นด์ดํฐ ๋์
scan
โ ์นด์ดํฐ ๋์ button.rx.tap
.map { _ in 1 }
.scan(0, accumulator: +)
.subscribe(onNext: counterLabel.rx.text)
D. buffer
โ 3๊ฐ์ฉ ๋ฐฐ์น ์ฒ๋ฆฌ
buffer
โ 3๊ฐ์ฉ ๋ฐฐ์น ์ฒ๋ฆฌsensorStream
.buffer(timeSpan: .seconds(1), count: 3, scheduler: MainScheduler.instance)
.filter { !$0.isEmpty }
.subscribe(onNext: uploadBatch)
3๏ธโฃ flatMap ํจ๋ฐ๋ฆฌ ์ ํ ๊ฐ์ด๋
๋คํธ์ํฌ ์์ฒญ, ์ด์ ๊ฒฐ๊ณผ ๋ฌด์
flatMapLatest
์ต์ ์์ฒญ๋ง ์ ์ง (์ทจ์)
์ฒซ ์์ฒญ ๊ณ ์ , ์ค๋ณต ๋ฌด์
flatMapFirst
๋ก๊ทธ์ธ ๋ฒํผ ๋๋ธ ํญ ๋ฐฉ์ง
์์ ๋ณด์ฅ, ์ง๋ ฌ ์คํ
concatMap
ํ์ผ ์ ๋ก๋ ์ฐจ๋ก๋๋ก
๋ชจ๋ ๋ด๋ถ ์คํธ๋ฆผ ๋ณํฉ
flatMap
์ด๋ฏธ์ง ํ๋ฆฌ๋ก๋ ๋์ ์คํ
4๏ธโฃ ์ฑ๋ฅ & ์๋ฌ ์ ๋ต
flatMap
์์ ๋ด๋ถ Observable์ด ๋ฌดํ ์คํธ๋ฆผ์ด๋ฉด dispose ์์ ๊ด๋ฆฌ ํ์.scan
์ด๊ธฐ๊ฐ ์ค์ ์ด ์ค์ โ ๋ถ๋ณ ๊ฐ์ฒด๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ์ํ ๋ฎ์.buffer
๋ก ํฐ ๋ฐฐ์ด ์์ฑ ์ ๋ฉ๋ชจ๋ฆฌ ํผํฌ ๊ฐ๋ฅ,window
(Observable) ๋์.
5๏ธโฃ Transform + Scheduler ์์
images
.flatMap { UIImageJPEGRepresentation($0, 0.8) ?? Data() } // ๋ณํ
.observe(on: ConcurrentDispatchQueueScheduler(qos: .utility)) // IO
.scan(Data(), +) // ๋์ ์์ถ
.observe(on: MainScheduler.instance)
.subscribe(onNext: updateProgress)
6๏ธโฃ Mini Quiz
flatMapLatest
๋ด๋ถ์์.share()
๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ํจ๊ณผ?scan
์ผ๋ก ๋์ ํฉ์ ๊ตฌํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ๋ฅผ ๋ฐฉ์งํ ๋ฐฉ๋ฒ์?buffer(timeSpan:.seconds(5), count: Int.max, ...)
์ค์ ์ ์ฃผ์์ ?
๋ค์ โถ๏ธ combining ๋ก ์ด๋ํด
merge
,combineLatest
,zip
๋ฑ์ ํ์ตํฉ์๋ค. ๐
Last updated