deferred, timer, interval
โฒ๏ธ deferred
, timer
, interval
โ ์๊ฐ ๊ธฐ๋ฐ ์ํ์ค ๋ง๋ณด๊ธฐ
deferred
, timer
, interval
โ ์๊ฐ ๊ธฐ๋ฐ ์ํ์ค ๋ง๋ณด๊ธฐโ์คํธ๋ฆผ์๋ ์๊ณ๊ฐ ํ์ํ๋ค!โ RxSwift๋ ์ง์ฐยท์ฃผ๊ธฐยท์ง์์ ์ธ ์ด๋ฒคํธ๋ฅผ ์์ฝ๊ฒ ์์ฑํ ์ ์๋ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
1๏ธโฃ Observable.deferred
โ ๊ตฌ๋
์์ ๋ง๋ค ์ ์ํ์ค
Observable.deferred
โ ๊ตฌ๋
์์ ๋ง๋ค ์ ์ํ์คvar flip = false
let deferred = Observable<String>.deferred {
flip.toggle()
return flip ? .just("๐ด") : .just("๐ต")
}
deferred.subscribe(onNext: print) // ๐ด
deferred.subscribe(onNext: print) // ๐ต
Cold: ๊ฐ ๊ตฌ๋ ์ ํด๋ก์ ์ฌํ๊ฐ.
์์กด์ฑ์ด ์๋ ์ด๊ธฐํ(ํ ํฐ ๊ฐฑ์ , ์์น ๊ถํ ์์ฒญ) ํจํด์ ํ์ฉ.
2๏ธโฃ Observable.timer
โ ์ง์ฐ ํ 1ํ ๋๋ ์ฃผ๊ธฐ ๋ฐฉ์ถ
Observable.timer
โ ์ง์ฐ ํ 1ํ ๋๋ ์ฃผ๊ธฐ ๋ฐฉ์ถ// 3์ด ๋ค 1ํ 0 ๋ฐฉ์ถ
Observable<Int>.timer(.seconds(3), scheduler: MainScheduler.instance)
.subscribe(onNext: { print($0) })
// 1์ด ๋ค ์์, ๊ทธํ 5์ด๋ง๋ค ์ฆ๊ฐ ์นด์ดํธ ๋ฐฉ์ถ
Observable<Int>.timer(.seconds(1), period: .seconds(5), scheduler: MainScheduler.instance)
period ํ๋ผ๋ฏธํฐ: ์๋ต ์ ๋จ๋ฐ์ฑ, ์ง์ ์
interval
๊ณผ ์ ์ฌ.์ฑ ์๋ฆผยทSplash ์คํต ๋ฒํผ ํ์ด๋จธ ๋ฑ์ ์ฌ์ฉ.
3๏ธโฃ Observable.interval
โ ๊ณ ์ ์ฃผ๊ธฐ ์คํธ๋ฆผ
Observable.interval
โ ๊ณ ์ ์ฃผ๊ธฐ ์คํธ๋ฆผObservable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
.map { "Tick \($0)" }
.subscribe(onNext: print)
0,1,2,3โฆ ์นด์ดํธ ์ ๋ฐ์ดํธ.
์ฃผ๊ฐ ์ฐจํธ, ์ด๋ ํ์ด๋จธ, ์ค์๊ฐ ์ผ์ ๋ฑ ๋ฐ๋ณต ์์ .
4๏ธโฃ Scheduler & Threading
MainScheduler
UI ํ์ด๋จธ, ์ ๋๋ฉ์ด์ ์งํ
ConcurrentDispatchQueueScheduler
๋ฐฑ๊ทธ๋ผ์ด๋ ํด๋ง ์์
TestScheduler
๊ฐ์ ์๊ฐ ํ
์คํธ (advanceTo
, start
)
iOS ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ํ์์ ๊ธด
interval
์WKBackgroundTask
๋์ ๊ณ ๋ ค.
5๏ธโฃ ์กฐํฉ ์์ โ 10์ด ์นด์ดํธ๋ค์ด
func countdown(from n: Int) -> Observable<Int> {
Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
.map { n - $0 }
.take(n + 1) // 0๊น์ง ํฌํจ
}
countdown(from: 10)
.subscribe(onNext: { print($0) },
onCompleted: { print("Go!") })
6๏ธโฃ Memory & Cancellation
DisposeBag
๋๋.takeUntil(trigger)
๋ก ์์ฝ ์์ ์ทจ์.timer/interval
์ ๋ด๋ถ GCD Timer โ retain ์ฃผ์ (disposed(by:)
).
let task = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
.subscribe(...)
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
task.dispose() // ํ์ด๋จธ ์ทจ์
}
7๏ธโฃ Mini Quiz
timer
์interval
์ ์ฃผ๊ธฐ ๋ฐฉ์ถ ์ฐจ์ด?deferred
๋ฅผ ํ์ฉํด ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ API ์คํธ๋ฆผ์ ์ ๊ณตํ๋ ค๋ฉด? (๊ฐ๋ ์ค๋ช )interval
์คํธ๋ฆผ์ ์ผ์ ์ค์งํ๋ค๊ฐ ๋ค์ ์์ํ๋ ค๋ฉด ์ด๋ค ์คํผ๋ ์ดํฐ ์กฐํฉ์ด ์ ์ฉํ ๊น?
๐ CreatingSequences ์ฑํฐ ์๋ฃ! ์ด์ Operators(Filtering) ํํธ๋ก ์ด๋ํด ์คํธ๋ฆผ ๊ฐ๊ณต์ ์์ํด ๋ด ์๋ค. ๐
Last updated