Filtering
๐ฟ Filtering Operators โ ํ์ํ ์ด๋ฒคํธ๋ง โ๊ฑธ๋ฌ๋ด๊ธฐโ
โSignal-to-noise ratio๋ฅผ ๋์ฌ๋ผ!โ
Filtering ๊ณ์ด ์คํผ๋ ์ดํฐ๋ Observable ์คํธ๋ฆผ์์ ํน์ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ด๋ ์ด๋ฒคํธ๋ง ํต๊ณผ์ํค๊ณ ๋๋จธ์ง๋ ๋ฌด์ํฉ๋๋ค. UI ์ ๋ ฅ ๋๋ฐ์ด์ค, ์ด๋ฒคํธ ๋ฌด์, ์ค๋ณต ์ ๊ฑฐ ๋ฑ ํํ ์ฌ์ฉ๋ฉ๋๋ค.
1๏ธโฃ ๋ํ Filtering ์คํผ๋ ์ดํฐ ์์ฝ
filter
์กฐ๊ฑด์ ๋ง๋ ๊ฐ๋ง ํต๊ณผ
(Element) -> Bool
take
/ takeLast
์ฒ์(N) / ๋ง์ง๋ง(N)๊ฐ ๊ฐ์ ธ์ค๊ธฐ
Int
skip
/ skipLast
์ฒ์(N) / ๋ง์ง๋ง(N)๊ฐ ๊ฑด๋๋ฐ๊ธฐ
Int
takeWhile
/ skipWhile
์กฐ๊ฑด true ๋์ ๊ฐ์ ธ์ค๊ธฐ / ๊ฑด๋๋ฐ๊ธฐ
(Element) -> Bool
distinctUntilChanged
๋์ผ ์ฐ์ ๊ฐ ์ ๊ฑฐ
==
๊ธฐ์ค (Equatable)
elementAt
ํน์ ์ธ๋ฑ์ค ๊ฐ 1๊ฐ
Int
ignoreElements
.completed
๋ง ์ ๋ฌ (๊ฐ ๋ฌด์)
โ
Time ๊ธฐ๋ฐ(
debounce
,throttle
)์ ๋ณ๋ ๋ฌธ์ timeBased.md์์ ๋ค๋ฃน๋๋ค.
2๏ธโฃ ์ค์ ์ค๋ํซ
A. ๋ก๊ทธ์ธ ๋ฒํผ ํ์ฑํ โ ๊ณต๋ฐฑ ์ ๊ฑฐ ํ ๋น์ด์์ง ์์์ง ์ฒดํฌ
textField.rx.text.orEmpty
.map { $0.trimmingCharacters(in: .whitespaces) }
.filter { !$0.isEmpty }
.bind(to: viewModel.username)
B. ์ฐ์ ํญ ๋ฐฉ์ง โ distinctUntilChanged()
button.rx.tap
.map { Date() }
.distinctUntilChanged { prev, next in next.timeIntervalSince(prev) < 0.3 }
.subscribe(onNext: performAction)
C. ์ฒ์ 3๊ฐ ์ํ๋ง ํ๋ฆฌ๋ทฐ ํ ์๋ ์ข
๋ฃ
photoStream
.take(3)
.subscribe(onNext: showSample,
onCompleted: { print("sample end") })
3๏ธโฃ Operator ์ฐ์ฐ ์์ ์ฃผ์
take(1).skip(1)
โก๏ธ ๊ฒฐ๊ณผ 0๊ฐ (take๊ฐ ๋จผ์ ์คํ)skip(1).take(1)
โก๏ธ ๋ ๋ฒ์งธ ์์ 1๊ฐ ์ ๋ฌ์ฒด์ธ ์์๋ฅผ ๋ฐ๊ฟ ๋ ๋จ์ ํ ์คํธ๋ก ๊ธฐ๋ ๊ฐ ํ์ธ ํ์
4๏ธโฃ Error & Completion ์ ํ ๊ท์น
Filtering ์คํผ๋ ์ดํฐ๋ onNext๋ง ํํฐ๋ง, onError / onCompleted๋ ๊ทธ๋๋ก ์ ํ.
ignoreElements
๋ onError๋ ๋ฌด์ํ์ง ์์ โ ์๋ฌ๋ ์์๋ก ์ ๋ฌ๋์ด์ผ ๋๋ฒ๊น ์ฉ์ด.
5๏ธโฃ Performance & Memory Tips
ํฐ ๋ฐฐ์ด์ ๋ฐฐ์ถํ๋ ์คํธ๋ฆผ์์
filter
ํmap
์์๋ก ์ต์ ํ (๋ถํ์ํ ๋งคํ ์ค์ด๊ธฐ).distinctUntilChanged
์ปค์คํ ๋น๊ต๋ ๊ฐ ํ์ ์ผ ๋ ๋น์ฉ ๊ณ ๋ ค.
6๏ธโฃ Mini Quiz
skipUntil(trigger)
์takeUntil(trigger)
์ฐจ์ด๋ฅผ ์ค๋ช ํ๋ผ.distinctUntilChanged
๊ฐEquatable
์ด ์๋ ํ์ ์์ ๋์ํ๋ ค๋ฉด?takeLast(1)
๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ฏธ์น๋ ์ํฅ์?
๋ค์ โถ๏ธ transforming ๋ก ์ด๋ํด
map
,flatMap
,scan
๋ฑ ๋ณํ ์คํผ๋ ์ดํฐ๋ฅผ ํ์ตํฉ๋๋ค. ๐
Last updated