ย Filtering Operator
Filtering Operator๋ Observable์ item๋ฅผ ์ ํ์ ์ผ๋ก ๋ฐฉ์ถํด์ฃผ๋ Operator ์
๋๋ค.
์์ ๋ฌธ์ฅ์ ์ข ๋ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ โ์ด๋ชจ์งโ์ฐฝ์ ๋ณผ๊ฒ์.
์ด๋ชจ์ง ํ๋ฉด
์ด๋ชจ์ง๋ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์ํ๋ ์ด๋ชจ์ง๋ฅผ ์ฐพ๊ณ ์ถ๋ค๋ฉด ์๋จ์ ์๋ ๊ฒ์ ๋ถ๋ถ์ ๋๋ฌ์ ์ํ๋ ์ด๋ชจ์ง ์ด๋ฆ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. ์ ๋ ์ฐ๋ ์ด๋ชจ์ง๋ฅผ ์ฐพ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋๋ฌผ ์ด๋ผ๊ณ ๊ฒ์ํด๋ณด๊ฒ ์ต๋๋ค.
์ฐ๋ ์ด๋ชจ์ง ํ๋ฉด
์ ๊ฐ ์ํ๋ ์ฐ๋ ์ด๋ชจ์ง๋ค๋ง ์๋ฉ ๋์๋ค์.
๊ฒ์์ฐฝ์ฒ๋ผ ๋ด๊ฐ ์ํ๋ ๊ฐ๋ง ๊ฑธ๋ฌ๋ด์ ๊ฐ์ ธ๋ค ์ฃผ๋ ๊ฒ์ด Filtering Operator ์
๋๋ค.
๊ทผ๋ฐ, Operator๋ ์ฝ๋์ ์๋ฌด ๋ถ๋ถ์ด๋ ์ฐ๋ฉด ์ ์ฉ์ด ๋๋๊ฑด๊ฐ์?
์๋๋๋ค. Operator๋ .next ์ด๋ฒคํธ์ ์กฐ๊ฑด๋ถ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ฉํ๋ ๊ฒ๋๋ค.
๋ฐ๋ผ์, ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด์ค Observable๊ณผ ์ด๋ฒคํธ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง๊ฐ ๋ํ๋ ์๋ next ์ฌ์ด์ Operator๋ฅผ ๋๋ฉด ๋ฉ๋๋ค. ํ๋จ ์ฝ๋์ฒ๋ผ ๋ง์ด์ฃ .
Observable
.filter { $0 < 10 } // ์ด ๋ถ๋ถ์ ์์ฑ
.subscribe { print($0) }
.disposed(by: bag)
Swift
๋ณต์ฌ
ย Filtering Operator์ ์ข ๋ฅ
Ignoring Operators
ignoreElements
next ์ด๋ฒคํธ๋ฅผ ๋ฌด์ํ๊ณ .error๋ .completed๋ฅผ ์ ๋ฌ
ignoreElements๋ .error๋ .completed๋ฅผ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ข
๋ฃ๋๋ ์์ ๋ง ์ ์ ์์ต๋๋ค.
let hamster = PublishSubject<String>()
let bag = DisposeBag()
hamster
.ignoreElements()
.subscribe (onNext: { food in
print("ํ์คํฐ๊ฐ ๋จน์ \(food)")
}, onCompleted: {
print("ํ์คํฐ ๋ฐฐ๋ถ๋ฆ")
})
.disposed(by: bag)
hamster.onNext("ํ๋ฒ๊ฑฐ")
hamster.onNext("์์์ง")
hamster.onNext("ํ")
hamster.onCompleted()
/*
ํ์คํฐ ๋ฐฐ๋ถ๋ฆ
*/
Swift
๋ณต์ฌ
element(at:)
๋ฐ์ํ ์ด๋ฒคํธ ์ค์ ์
๋ ฅํ index๋ฒํธ์ ์ด๋ฒคํธ๋ง ์์
let hamster = PublishSubject<String>()
let bag = DisposeBag()
hamster
.element(at: 1)
.subscribe (onNext: { food in
print("ํ์คํฐ๊ฐ ๋จน์ \(food)")
}, onCompleted: {
print("ํ์คํฐ ๋ฐฐ๋ถ๋ฆ")
})
.disposed(by: bag)
hamster.onNext("ํ๋ฒ๊ฑฐ")
hamster.onNext("์์์ง")
hamster.onNext("ํ")
hamster.onCompleted()
/*
ํ์คํฐ๊ฐ ๋จน์ ์์์ง
ํ์คํฐ ๋ฐฐ๋ถ๋ฆ
*/
Swift
๋ณต์ฌ
filter
๋ฐฉ์ถํ ์ด๋ฒคํธ์ ๋ํ ์กฐ๊ฑด์ ๊ฑบ
filter๋ ๋ด๋ถ์ ์กฐ๊ฑด๋ฌธ์ ๋ช
์์ ์ผ๋ก ๊ฑธ์ด์ ์์๋ค์ ํํฐ๋งํฉ๋๋ค.
let books = ["๋ฐ๋ฏธ์", "1984", "์ธ๊ฐ์ค๊ฒฉ", "๋๋ฌผ๋์ฅ", "๋ชจ๋ชจ"]
let bag = DisposeBag()
Observable.from(books)
.filter { $0.count > 3 }
.subscribe (onNext: { book in
print("๋ด๊ฐ ๋ณธ \(book)")
}, onCompleted: {
print("์ง์ ์ถฉ์ ์๋ฃ")
})
.disposed(by: bag)
/*
๋ด๊ฐ ๋ณธ 1984
๋ด๊ฐ ๋ณธ ์ธ๊ฐ์ค๊ฒฉ
๋ด๊ฐ ๋ณธ ๋๋ฌผ๋์ฅ
์ง์ ์ถฉ์ ์๋ฃ
*/
Swift
๋ณต์ฌ
Skipping Operators
skip
์ฒ์ ๋ฐ์ํ๋ n(์
๋ ฅํ ๊ฐ์)๊ฐ์ ์ด๋ฒคํธ๋ฅผ skip
let books = ["๋ฐ๋ฏธ์", "1984", "์ธ๊ฐ์ค๊ฒฉ", "๋๋ฌผ๋์ฅ", "๋ชจ๋ชจ"]
let bag = DisposeBag()
Observable.from(books)
.skip(5)
.subscribe (onNext: { book in
print("๋ด๊ฐ ๋ณธ \(book)")
}, onCompleted: {
print("์ง์ ์ถฉ์ ์๋ฃ")
})
.disposed(by: bag)
/*
์ง์ ์ถฉ์ ์๋ฃ
*/
Swift
๋ณต์ฌ
skip(while:)
ํน์ ์กฐ๊ฑด์ด false์ผ ๋๊น์ง skipํ๊ณ ๊ทธ ์ดํ์ ์์๋ค์ ๋ฐฉ์ถ
filter์ ๊ธฐ๋ฅ์ด ์ ์ฌํ์ง๋ง โต ์กฐ๊ฑด์ ํต๊ณผํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ skipํ๋ค๋ ์ ์ด ๋ค๋ฆ
๋๋ค. โถ ํ ๋ฒ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๊ณ ๋๋ฉด ๊ทธ ์ดํ์๋ ์กฐ๊ฑด์ ์๊ด์์ด ๋ชจ๋ ๊ฐ์ ๋ฐฉ์ถํฉ๋๋ค.
let books = ["๋ฐ๋ฏธ์", "1984", "์ธ๊ฐ์ค๊ฒฉ", "๋๋ฌผ๋์ฅ", "๋ชจ๋ชจ"]
let bag = DisposeBag()
Observable.from(books)
.skip { $0 != "์ธ๊ฐ์ค๊ฒฉ" }
.subscribe (onNext: { book in
print("๋ด๊ฐ ๋ณธ \(book)")
}, onCompleted: {
print("์ง์ ์ถฉ์ ์๋ฃ")
})
.disposed(by: bag)
/*
๋ด๊ฐ ๋ณธ ์ธ๊ฐ์ค๊ฒฉ
๋ด๊ฐ ๋ณธ ๋๋ฌผ๋์ฅ
๋ด๊ฐ ๋ณธ ๋ชจ๋ชจ
์ง์ ์ถฉ์ ์๋ฃ
*/
Swift
๋ณต์ฌ
skip(until:)
๋ค๋ฅธ Observable์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ธฐ ์ ๊น์ง ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ skip
let kDaughterHamster = PublishSubject<String>()
let kFatherHamster = PublishSubject<String>()
let bag = DisposeBag()
kDaughterHamster
.skip(until: kFatherHamster)
.subscribe (onNext: { food in
print("๋ธ๋๊ตฌ ํ์คํฐ๊ฐ ๋จน์ \(food)")
}, onCompleted: {
print("๋ธ๋๊ตฌ ํ์คํฐ ๋ฐฐ๋ถ๋ฆ")
}).disposed(by: bag)
kDaughterHamster.onNext("ํ๋ฒ๊ฑฐ")
kDaughterHamster.onNext("์์์ง")
kDaughterHamster.onNext("ํ")
kFatherHamster.onNext("์ผ๊ฒน์ด")
kDaughterHamster.onNext("๋๋ฌผ")
// ์ ๊ต๊ฑธ ๋ธ๋๊ตฌ ํ์คํฐ๋ ์๋น ํ์คํฐ๊ฐ ์์ ๋ฅผ ๋ค๊ธฐ ์ ๊น์ง ์์์ ๋จน์ง ๋ชปํฉ๋๋ค.
/*
๋ธ๋๊ตฌ ํ์คํฐ๊ฐ ๋จน์ ๋๋ฌผ
*/
Swift
๋ณต์ฌ
Taking Operators
take
์
๋ ฅํ ๊ฐ์๋งํผ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ ๋๋จธ์ง๋ ๋ฌด์
skip๊ณผ๋ ๋ฐ๋๋ก ์ฒ์ n(์
๋ ฅํ ๊ฐ์)๊ฐ์ ์์๋ค๋ง ๋ฐฉ์ถํฉ๋๋ค.
let books = ["๋ฐ๋ฏธ์", "1984", "์ธ๊ฐ์ค๊ฒฉ", "๋๋ฌผ๋์ฅ", "๋ชจ๋ชจ"]
let bag = DisposeBag()
Observable.from(books)
.take(3)
.subscribe (onNext: { book in
print("๋ด๊ฐ ๋ณธ \(book)")
}, onCompleted: {
print("์ง์ ์ถฉ์ ์๋ฃ")
})
.disposed(by: bag)
/*
๋ด๊ฐ ๋ณธ ๋ฐ๋ฏธ์
๋ด๊ฐ ๋ณธ 1984
๋ด๊ฐ ๋ณธ ์ธ๊ฐ์ค๊ฒฉ
์ง์ ์ถฉ์ ์๋ฃ
*/
Swift
๋ณต์ฌ
take(while:)
ํน์ ์กฐ๊ฑด์ด false์ผ ๋๊น์ง ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถ
skip(while:)๊ณผ๋ ๋ฐ๋๋ก ํน์ ์กฐ๊ฑด์ด false ์ผ ๋๊น์ง๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํฉ๋๋ค.
let books = ["๋ฐ๋ฏธ์", "1984", "์ธ๊ฐ์ค๊ฒฉ", "๋๋ฌผ๋์ฅ", "๋ชจ๋ชจ"]
let bag = DisposeBag()
Observable.from(books)
.take(while: { $0.count < 4 })
.subscribe (onNext: { book in
print("๋ด๊ฐ ๋ณธ \(book)")
}, onCompleted: {
print("์ง์ ์ถฉ์ ์๋ฃ")
})
.disposed(by: bag)
/*
๋ด๊ฐ ๋ณธ ๋ฐ๋ฏธ์
์ง์ ์ถฉ์ ์๋ฃ
*/
Swift
๋ณต์ฌ
take(until:)
๋ค๋ฅธ Observable์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ธฐ ์ ๊น์ง ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถ
skip(until:)๊ณผ๋ ๋ฐ๋๋ก ๋ค๋ฅธ Observable์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋์ด์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ์ง ์์ต๋๋ค.
let hamster๋๋ฌด = PublishSubject<String>()
let trigger = PublishSubject<String>()
let disposeBag = DisposeBag()
hamster๋๋ฌด
.take(until: trigger)
.subscribe(onNext: { work in
print("์ผํ์ ํ์คํฐ ๋๋ฌด, ํ์ \(work)")
}).disposed(by: disposeBag)
hamster๋๋ฌด.onNext("๋ฐ๋์ง")
hamster๋๋ฌด.onNext("๊ณต์ฅ์ผ")
trigger.onNext("ํ์คํฐ ๋๋ฌด!! ๊ตญ๊ธฐ์ ๋ํ ๊ฒฝ๋ก๋ฅผ ํ์๊ฒ!!")
hamster๋๋ฌด.onNext("์ฝ๋ฉ")
/*
์ผํ์ ํ์คํฐ ๋๋ฌด, ํ์ ๋ฐ๋์ง
์ผํ์ ํ์คํฐ ๋๋ฌด, ํ์ ๊ณต์ฅ์ผ
*/
Swift
๋ณต์ฌ
takeLast
์๋ฃ๊ฐ ๋๋ฉด ์
๋ ฅํ ๊ฐ์๋งํผ ์ด์ ์ ์ด๋ฒคํธ๊ฐ ๋ฐฉ์ถ
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let subject = PublishSubject<Int>()
let disposeBag = DisposeBag()
subject
.takeLast(2)
.subscribe { print($0) }
.disposed(by: disposeBag)
numbers.forEach {
subject.onNext($0)
}
subject.onNext(11)
subject.onCompleted()
/*
next(10)
next(11)
completed
*/
Swift
๋ณต์ฌ
Distinct Operators
distinctUntilChanged
์ฐ๋ฌ์ ๋์ค๋ ์ค๋ณต ์์ ๋ฌด์
let disposeBag = DisposeBag()
Observable.of("๋ธ๊ธฐ", "๋น๊ทผ", "๋น๊ทผ", "์๋ฐ", "์๋ฐ", "๋ฉ๋ก ", "์๋ฐ")
.distinctUntilChanged()
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
/*
๋ธ๊ธฐ
๋น๊ทผ
์๋ฐ
๋ฉ๋ก
์๋ฐ
*/
Swift
๋ณต์ฌ