Observable sequence ๋งจ ์์ ๊ธฐ์กด Observable ์ type ๊ณผ ๊ฐ์ type ์ data ๋ฅผ ๋ถ์ฌ์ค๋ค.
ํ์ฌ ์ํ์ ์ด๊ธฐ๊ฐ์ ๋ถ์ฌ์ ์ ๋ฌํ ๋ ์ฌ์ฉ.
let numbers = Observable.of(2, 3, 4)
let observable = numbers.startsWith(1)
observable
.subscribe(onNext: { print($0) } )
2๊ฐ์ sequence ๋ฅผ ๋ฌถ๋๋ค.
let first = Observable.of(1, 2, 3)
let second = Observable.of(4, 5, 6)
let observable = Observable.concat([first, second]) // 1 2 3 4 5 6
์์ ๊ฐ์. ์ด๋ ๊ฒ๋ ์ธ ์ ์๋ค.
let observable = first.concat(second)
flatMap ๊ณผ ๋น์ทํ์ง๋ง, ์์๋ฅผ ๋ณด์ฅํ๋ค.
๋จผ์ ๊ตฌ๋
ํ๋ ๊ฒ์ Observable sequence ๋ฅผ ๋ชจ๋ ๋ฐฉ์ถํ ๋ค์,
๊ทธ ๋ค์์ ๊ตฌ๋
ํ๋ ๊ฒ์ Observable sequence ๋ฅผ ๋ฐฉ์ถํ๋ค.
map ์ด๋๊น ํจ์๋ ์ ์ฉํ ์ ์์.
let sequences = [
"Germany" : Observable.of("Berlin", "Munich", "Frankfurt"),
"Spain" : Observable.of("Madrid", "Barcelona", "Valencia")
]
// Germany ๋ฅผ ๋จผ์ ๊ตฌ๋
ํ๊ฒ ๋๋ค.
let observable = Observable.of("Germany", "Spain")
.concatMap({ country in
sequences[country] ?? Observable.empty()
})
Observable Sequence ๊ฐ ๋ด๋ ค์ค๋ Sequence ๋ฅผ ๊ตฌ๋
ํ๋ค.
์ฌ๋ฌ Sequence ๋ฅผ ๊ณ ๋๋ก ๋ด๋ ค์ ํ๋๋ก ํฉ์น๋ค๊ณ ์๊ฐํ๋ฉด ๋จ. (์ ๋์ ์ธ ์์)
ํฉ์น ์ ์๋ Sequence ์ ์๋ฅผ ์ ํ.
maxConcurrent ๊ฐ์ Observable Sequence ๊ฐ ๋ค์ด์ค๊ณ ๋ Observable ์ด ๋ค์ด์ค๋ฉด,
๋๊ธฐ์ด์ ๋ฃ์ด๋๊ณ ํ์ฌ Sequence ์ค ํ๋๊ฐ ์๋ฃ๋๋ฉด ๋ฐ๋ก ๊ตฌ๋
์ ์์.
๋ง์ด ์ฐ์ง ์์ง๋ง, ๋คํธ์ํฌ ์์ฒญ์ด ๋ง์์ง ๋์ฒ๋ผ ์ ํ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
let source = Observable.of(left.asObservable(), right.asObservable())
let observable = source.merge()
๊ฐ Sequence ์ ํ์ฌ ์์ ๊ฐ์ฅ ๋ง์ง๋ง ๊ฒ์ ํฉ์น๋ค.
์ด๋ป๊ฒ ํฉ์น ์ง์ ๋ํ ํจ์๋ฅผ resultSelector ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก tuple ๋ก ํฉ์น๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
let left = PublishSubject<String>()
let right = PublishSubject<String>()
let observable = Observable.combineLatest(left, right, resultSelector: { lastLeft, lastRight in
return "\(lastLeft) \(lastRight)"
})
// ์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ์ ๋ฌ ๊ฐ๋ฅ.
let observable = Observable.combineLatest([left, right], resultSelector: { strings in
strings.joined(separator: " ")
}
๊ฐ Observable ์ ๊ฐ์ index ๋ผ๋ฆฌ ํฉ์น๋ค.
๋จ๋๊ฑด ๋ฒ๋ฆผ - ๋ Sequence ์ค ํ๋๋ผ๋ ์ข
๋ฃ๋๋ฉด zip ๋ ๊ฒ๋ ์ข
๋ฃ.
์ฌ๋ฌ๊ฐ์ Observable ๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋,
์ด๋ค Observable ์ ์ ๋ณด๋ฅผ ์ฃผ๋๊ฒ ์๋๋ผ ๊ทธ์ trigger ์ญํ ์ ํ ์ ์๋ค.
button ์ ๋๋ฅด๋ฉด textField ์ ๊ฐ์ฅ ๋ง์ง๋ง ๊ฒ์ ๋ฐฉ์ถ
let button = PublishSubject<Void>()
let textField = PublishSubject<String>()
let observable = button.withLatestFrom(textField)
// ๋ฒํผ์ ๊ตฌ๋
ํ๋๋ฐ, ๋ฒํผ์์ ๋ญ๊ฐ ๋ค์ด์ค๋ฉด textField ์ ๊ฐ์ฅ ๋ง์ง๋ง ๊ฒ์ ๋ณด๋ด์ฃผ๋ ๊ฒ.
_ = observable.subscribe(onNext: { print($0) })
textField.onNext("Par")
textField.onNext("Pari")
textField.onNext("Paris")
button.onNext(()) // Paris
button.onNext(()) // Paris
withLatestFrom ๊ณผ ๋น์ทํ๊ฒ ์๋ํ์ง๋ง, trigger ๊ฐ ๋๋ ๊ฒ์ ์ฌ๋ฌ๋ฒ ํด๋ ํ๋ฒ๋ง ์ถ๋ ฅ๋จ
let observable = textField.sample(button)
// ์์๋ ๋ฐ๋. textField ์ sample ๊ฐ์ธ ๋ฒํผ
// textField ์ ๋์ด์ onNext ๋ก ๊ฐ์ด ๋์ด์ค์ง ์์ ๋
// button ์ onNext ๊ฐ ์ฌ๋ฌ๊ฐ ๊ฐ๋ ํ๋ฒ๋ง ์ถ๋ ฅ๋จ.
// textField ์ ๊ฐ์ด ๋ ๋์ด๊ฐ๋ฉด ์ถ๋ ฅ ๋จ
textField.onNext("Par")
textField.onNext("Pari")
button.onNext(()) // Pari
textField.onNext("Paris")
button.onNext(()) // Paris
button.onNext(())
1๊ณผ 2๋ ๊ฐ์ ์ญํ ์ ํ๋ ์ฝ๋์ด์ง๋ง ์ฒด์ด๋์ ๋ํ๋๊ฒ ์ข๋ค.
// 1
// trigger ๋ฅผ parameter ๋ก ๋ฐ์
let observable = textField.sample(button)
_ = observable
// 2
// data ๋ฅผ parameter ๋ก ๋ฐ์
let observable2 = button.withLatestFrom(textField)
_ = observable2
.distinctUntilChanged()
ambiguous ๋ชจํธํ.
์ฌ๋ฌ sequence ์ค ์ด๋ค ๊ฒ์ ๊ตฌ๋
ํ ์ง ์ ํํ ์ ์๊ฒ ๋ง๋ ๋ค.
๋จผ์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋ ์ชฝ์ ๋ฐฉ์ถํ๊ณ , ์ฌ๋ฌ sequence ์ค ํ๋๋ผ๋ complete ๋๋ฉด completed.
let observable = left.amb(right)
// left, right ๋ฅผ ๋ชจ๋ ๊ตฌ๋
ํ๊ณ ์๋ค๊ฐ left right ์ค event ๋ฅผ ๋จผ์ ๋ฐฉ์ถํ๋ ์ชฝ๋ง ๊ตฌ๋
// ๋๋จธ์ง๋ ๊ตฌ๋
๋์ด๋ฒ๋ฆผ
observable sequence ๋ฅผ data ๋ก ๊ฐ์ง๋ Observable ์์
์ด๋ค Observable ์ด ๋ด๋ ค์ค๋ฉด ํด๋น Observable ์ ๊ตฌ๋
ํ๊ณ ์๋ค๊ฐ,
๋ค๋ฅธ Observable ์ด ๋ด๋ ค์ค๋ฉด ๋ค๋ฅธ Observable ์ ๊ตฌ๋
ํด๋น ์์ ๋ถํฐ์ event ๋ค๋ง emit
let one = PublishSubject<String>()
let two = PublishSubject<String>()
let three = PublishSubject<String>()
let source = PublishSubject<Observable<String>>()
let observable = source.switchLatest()
let disposable = observable.subscribe(onNext: { print($0) })
source.onNext(one) // one ์ ๊ตฌ๋
two.onNext("Some txt from two")
one.onNext("Some txt from one")
two.onNext("Some txt from two")
source.onNext(two) // two ๋ฅผ ๊ตฌ๋
two.onNext("Some txt from two")
one.onNext("Some txt from one")
source.onNext(three) // three ๋ฅผ ๊ตฌ๋
two.onNext("Why don't you see me?")
one.onNext("I'm alone, help me")
three.onNext("Hey~")
source.onNext(one)
one.onNext("asdf")
disposable.dispose()
์ด๊ธฐ๊ฐ์ accumulator ์ ์๋ ์ฐ์ฐ์ ์์์ค๋ค.
์์ Observable ์ด ์ข
๋ฃ๋๋ ์์ ์ ๊ฒฐ๊ณผ๊ฐ๋ง ๋ฐฉ์ถํ๊ณ completed
reduce ์ฒ๋ผ ์๊ธด ํ๋๋ฐ ์ฐ์ฐ ๊ณผ์ ์์ ๋์ค๋ ๋จ๊ณ๋ณ ๊ฒฐ๊ณผ๊ฐ๋ ๋ฐฉ์ถํ๋ค.
zip ์ ์ด์ฉํด์ ์๋ ๊ฐ, scan ํด์ ์์ ์ดํฉ์ ๋ ๋ค ์ถ๋ ฅํด๋ณด์.
let source = Observable.of(1,3,5,7,9)
let observable2 = source.scan(0, accumulator: { summary, newValue in
return summary + newValue
})
observable2.subscribe(onNext: { print($0) })
let newSequence = Observable.zip(source, observable2)
newSequence.subscribe(onNext: { print($0) })