ย Combining Operator
Combining Operator๋ Sequence๋ค์ ๋ชจ์ผ๊ณ , ๊ฐ Sequence ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณํฉํ๋ Operator์
๋๋ค.
์ฆ, ์๋ก ๋ค๋ฅธ ์คํธ๋ฆผ์ ํ๋์ ์คํธ๋ฆผ์ผ๋ก ํฉ์ณ์ ์ฌ์ฉํด์ผ ํ๊ฑฐ๋, ์ฌ๋ฌ Observable์ ๋ฌถ์ด์ ์ฌ์ฉํด์ผ ํ ๋ ํด๋น ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
URL Request์์ ๋ ๊ฐ์ ์๋ต์ ๋ฐ์์ ํ๋๋ก ๋ฌถ์ด์ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ฑฐ๋, ์์ด๋์ ๋น๋ฐ๋ฒํธ ์
๋ ฅ์ ๋ฐ๊ณ , ๊ฐ๊ฐ์ ์ด๋ฒคํธ๋ค์ ์์ด์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํด์ผ ํ๋ค๋ฉด Combining Operator๋ฅผ ์ฌ์ฉํ๋ฉด ํธํฉ๋๋ค.
ย Combining Operator์ ์ข ๋ฅ
startWith
Observable์ด ์์ดํ
์ ๋ฐํํ๊ธฐ ์ ์ ํน์ ์์ดํ
์ ๋จผ์ ๋ฐํ
startWith๋ Observable ์ํ์ค ์์ ๋ค๋ฅธ ๊ฐ ํ๋๋ฅผ ์ถ๊ฐ์์ผ์ค๋๋ค. ์ฒ์ ์ด๋ฒคํธ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ์ถ๋ค๋ฉด startWith๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
let disposeBag = DisposeBag()
let observable = Observable.of("ํจ์ฐ", "์ ๋ฆฌ", "์์", "์ค์", "์ํ")
observable
.startWith("ํ์ฐ")
.startWith("์จ๋")
.startWith("ํฐํ๋")
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
/*
ํฐํ๋
์จ๋
ํ์ฐ
ํจ์ฐ
์ ๋ฆฌ
์์
์ค์
์ํ
*/
Swift
๋ณต์ฌ
combineLatest
๋ Observable์์ ๊ฐ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋, ๊ทธ ์ด๋ฒคํธ๋ค ์ค์ ๋ง์ง๋ง ์ด๋ฒคํธ๋ค์ ๋ฌถ์ด์ ์ ๋ฌ
combineLatest๋ ์ฌ๋ฌ Observable์์ ๊ฐ์ฅ ์ต์ ๊ฐ์ ๋ณํฉํ์ฌ ๋ฐฉ์ถํฉ๋๋ค. ์ฌ๋ฌ Observable ์ค ํ๋์ Observable๋ง ๊ฐ์ ๋ฐฉ์ถํ๋ค๋ฉด ์๋ฌด์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
ํ์ง๋ง, ๋ชจ๋ Observable์ด ๊ฐ์ ํ ๋ฒ์ฉ ๋ฐฉ์ถํ๋ค๋ฉด ๊ทธ ์ดํ์๋ ๋ฐฉ์ถํ๋ ์ต์ ๊ฐ์ ๋ฐ์ต๋๋ค.
let disposeBag = DisposeBag()
let person = PublishSubject<String>()
let dog = PublishSubject<String>()
Observable
.combineLatest(person, dog, resultSelector: { lastPerson, lastDog in
"\(lastPerson)๋ค ๊ฐ์์ง \(lastDog)"
})
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
person.onNext("์ฒ ์")
person.onNext("์งฑ๊ตฌ")
dog.onNext("์ฝฉ์ด")
dog.onNext("ํฐ๋ฅ์ด")
person.onNext("ํ์ด")
// person ---์ฒ ์---์งฑ๊ตฌ------------ํ์ด-----
// dog -------------์ฝฉ์ด---ํฐ๋ฅ์ด---------
/*
์งฑ๊ตฌ๋ค ๊ฐ์์ง ์ฝฉ์ด
์งฑ๊ตฌ๋ค ๊ฐ์์ง ํฐ๋ฅ์ด
ํ์ด๋ค ๊ฐ์์ง ํฐ๋ฅ์ด
*/
Swift
๋ณต์ฌ
withLatestFrom
ํ์ชฝ Observable์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋, ๋ ๊ฐ์ Observable์ ๋ณํฉ
withLatestFrom๋ ํน์ ํธ๋ฆฌ๊ฑฐ ๋ฐ์ ์, ํน์ ์ํ์ ์ต์ ๊ฐ์ ์ป๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค. ๋ณํฉํ ๋ค๋ฅธ Observable์ ์ด๋ฒคํธ๊ฐ ์๋ค๋ฉด ์ด๋ฒคํธ๋ ์คํต๋ฉ๋๋ค.
let disposeBag = DisposeBag()
let button = PublishSubject<Void>()
let textField = PublishSubject<String>()
button
.withLatestFrom(textField)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
textField.onNext("ใฑ")
textField.onNext("๊ฑฐ")
textField.onNext("๊ฒ")
textField.onNext("๊ฒ์")
textField.onNext("๊ฒ์!")
button.onNext(())
button.onNext(())
/*
๊ฒ์!
๊ฒ์!
*/
Swift
๋ณต์ฌ
withLatestFrom์ distinctUntilChanged๋ฅผ ํฉ์น sample Operator๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์์์ ๋ฐ์ํ๋ ์ค๋ณต ๋ฌธ์ ๋ ๋ง์ ์ ์์ต๋๋ค.
let disposeBag = DisposeBag()
let button = PublishSubject<Void>()
let textField = PublishSubject<String>()
textField
.sample(button)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
textField.onNext("ใฑ")
textField.onNext("๊ฑฐ")
textField.onNext("๊ฒ")
textField.onNext("๊ฒ์")
textField.onNext("๊ฒ์!")
button.onNext(())
button.onNext(())
/*
๊ฒ์!
*/
Swift
๋ณต์ฌ
merge
์ฌ๋ฌ Observable์ ํ๋๋ก ํฉ์ณ์ ์์ดํ
์ ๋ฐํ
merge๋ ์ํ์ค๋ฅผ ํฉ์ณ์ฃผ๋ Operator์
๋๋ค. mergeํ๊ณ ์๋ ์ฌ๋ฌ ์ํ์ค๋ค์ ๋์์ ๊ตฌ๋
ํ๋ฉด์ ๋จผ์ ์ค๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ก ๋ฐ๋ก ๋ฐฉ์ถํฉ๋๋ค.
๋ด๋ถ ์ํ์ค๊ฐ completed๋๋ ์์ ์ ๋ชจ๋ ๋
๋ฆฝ์ ์ด์ง๋ง, ๋ด๋ถ ์ํ์ค๊ฐ ์ข
๋ฃ๋๋ฉด merge ์ํ์ค๋ ์ข
๋ฃ๋ฉ๋๋ค. ๋ง์ฝ, ๋ด๋ถ ์ํ์ค๊ฐ error ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋ฉด merge ์ํ์ค๋ ์๋ฌ๋ฅผ ๋ฐฉ์ถ์ํค๋ฉด์ ์ข
๋ฃ๋ฉ๋๋ค.
merge๋ ์ฌ๋ฌ Observable์ ํ๋๋ก ํฉ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ ํ์
์ด ๊ฐ์์ผ์ง๋ง ๊ฐ๋ฅํฉ๋๋ค.
let disposeBag = DisposeBag()
let a = Observable.of(10, 4, 3, 2)
let b = Observable.of(4, 5, 2, 1)
Observable.merge(a, b)
.subscribe(onNext: {
print($0, terminator: " ")
})
.disposed(by: disposeBag)
/*
10 4 4 5 3 2 2 1
*/
Swift
๋ณต์ฌ
zip
๋ Observable์ ๋ฐ์ ์์๊ฐ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์กฐํฉํด์ ๋ฐฉ์ถ
zip์ combineLatest์ ๋น์ทํ์ง๋ง ๋ค๋ฅธ ๊ฐ๋
์
๋๋ค. combineLatest๋ ๊ฐ ์คํธ๋ฆผ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ฐ๋ก ์๋ก์ด ์ด๋ฒคํธ๊ฐ ๋ด๋ ค์ค์ง๋ง, zip์ ๋ชจ๋ ์คํธ๋ฆผ์ ๊ฐ์ ํ์์ ์ด๋ฒคํธ๊ฐ ๋ค์ด์ฌ ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถ์ํต๋๋ค. ์ด๋ฒคํธ๊ฐ ์์ ์ด๋ฃจ์ง ์๋๋ค๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถ์ํค์ง ์์ต๋๋ค.
let disposeBag = DisposeBag()
let flower = Observable.of("james", "nick", "thomas", "john")
let basket = Observable.of("charlotte", "vicky", "ellen")
Observable.zip(flower, basket)
.subscribe(onNext: {
print($0) })
.disposed(by: disposeBag)
/*
("james", "charlotte")
("nick", "vicky")
("thomas", "ellen")
*/
Swift
๋ณต์ฌ
switchLatest
Observable์์ ๋ฐํํ๋ Observable์ ๋ค๋ฅธ Observable๋ก ๋ณ๊ฒฝํ์ฌ ์์ดํ
๋ฐํ
๊ฐ์ฅ ์ต์ ์ Observable์์ ๋ฐํํ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐํํฉ๋๋ค. Observable๋ฅผ ์ ํ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
let disposeBag = DisposeBag()
let netfilx = PublishSubject<String>()
let tving = PublishSubject<String>()
let remoteControl = BehaviorSubject<Observable<String>>(value: netfilx)
remoteControl
.switchLatest()
.subscribe {
print($0)
}
.disposed(by: disposeBag)
netfilx.on(.next("D.P."))
remoteControl.on(.next(tving))
netfilx.on(.next("๋ง์คํฌ๊ฑธ"))
tving.on(.next("์ ๋ฏธ์์ธํฌ๋ค"))
tving.on(.next("์ ๊พผ๋์์ฌ์๋ค"))
/*
next(D.P.)
next(์ ๋ฏธ์์ธํฌ๋ค)
next(์ ๊พผ๋์์ฌ์๋ค)
*/
Swift
๋ณต์ฌ
concat
์ฌ๋ฌ Sequence๋ฅผ ์์๋๋ก ๋ฌถ์ด์ค
์ฒซ ๋ฒ์งธ Sequence๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ตฌ๋
ํ๊ณ ๋ค์ Sequence๋ฅผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ๋
ํฉ๋๋ค.
concat์ ์์๋ค์ด ๊ฐ์ ํ์
์ผ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ์ฌ๋ฌ ๊ฐ์ ์์๋ฅผ ์ ๋ค๋ก ์ถ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
let disposeBag = DisposeBag()
let carnivore = Observable.of("ํธ๋์ด", "์ฌ์")
let omnivore = Observable.of("๊ฐ์์ง", "์ฌ์ฐ")
let herbivores = Observable.of("์ฝ๋ผ๋ฆฌ", "์ฌ์ด")
Observable
.concat([carnivore, omnivore, herbivores])
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
/*
ํธ๋์ด
์ฌ์
๊ฐ์์ง
์ฌ์ฐ
์ฝ๋ผ๋ฆฌ
์ฌ์ด
*/
Swift
๋ณต์ฌ
reduce
๋ชจ๋ ๊ฐ์ ๋ํ ๊ฐ ๋ฐฉ์ถ
Swift์์ ์ ๊ณตํด์ฃผ๋ reduce ๋ฉ์๋๋ก๋ ๋์ผํ๊ฒ ๋ชจ๋ ๊ฐ์ ๋ํ ์ ์์ต๋๋ค.
let disposeBag = DisposeBag()
let receipt = Observable.of(10000, 23000, 150000, 40000)
receipt
.reduce(0, accumulator: +)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
/*
223000
*/
Swift
๋ณต์ฌ
scan
ํ๋์ฉ ๋ํ ๋๋ง๋ค ์ฆ๊ฐ๋ ๊ฐ์ ๋ฐฉ์ถ
scan์ ๊ฐ์ ์ ์ฅํ ์ ์๊ณ , ๊ทธ ๊ฐ์ ํตํด ์ด๋ฒคํธ๋ฅผ ๋ณํํ ์ ์์ต๋๋ค. ๋ณํํ๋ ์ด๋ฒคํธ์ ํ์
์ ์๋ณธ ์ด๋ฒคํธ์ ํ์
๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
scan์ ์ฆ๊ฐ๋ ๊ฐ๋ค์ ๊ธฐ๋ณธ์ด ๋ ์ด๊ธฐ๊ฐ์ ์ง์ ํด์ผ ํฉ๋๋ค.
let disposeBag = DisposeBag()
let observable = Observable.of("1,", "2,", "3,", "4,", "5")
observable
.scan("number: ") { $0 + $1 }
.subscribe(onNext: {
print("\($0)")
})
.disposed(by: disposeBag)
/*
number: 1,
number: 1,2,
number: 1,2,3,
number: 1,2,3,4,
number: 1,2,3,4,5
*/
Swift
๋ณต์ฌ