RxSwift 스터디 8주차 Time Based Operators (cold, hot)
목차
1. delaySubscription
- Cold Observable, Hot Observable
2. delay
3. timer
4. timeout
delaySubscription
- delay와 비슷하지만, 구독 자체를 늦게하여, 들어오는 이벤트도 알 수 없다.
- 지연 시간동안 들어오는 이벤트가 구독이 안되어 있어서 처리가 안돼. 즉, 구독받는 시점 자체를 뒤로 미룬다는 말이야. 그럼 일정 요소를 건너 뛸 수도 있어.
print(" ===== delaySubscription ===== ")
Observable.of(1,2,3,4,5)
.delaySubscription(.seconds(Int(5)), scheduler: MainScheduler.instance)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
// 결과값
(5초 지연 후)
1
2
3
4
5
- Cold Observable, Hot Observable

delay
- 이건 다른 시간에도 본적이 있는데, 시퀀스의 시작 시점을 아예 뒤로 미루는거야. 즉, 구독 시점 이후 이벤트가 들어오면 모두 알고 있다가 요소를 방출하는 것을 지연시간 후에 보내. 이게 구독을 아예 지연시키는 거랑 차이가 있어.
print(" ===== delay ===== ")
Observable.of(1,2,3,4,5)
.delay(.seconds(Int(5)), scheduler: MainScheduler.instance)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
// 결과값
(5초 지연 후)
1
2
3
4
5
timer
- 좀 더 강력한 타이머를 원한다면 Observable.timer(_:period:scheduler:) 연산자를 사용
- 이 연산자는 앞서 설명한 Observable.interval(_:scheduler:) 과 아주 유사하지만 몇가지 차이점 존재
- 구독과 첫번째 값 방출 사이에서 "마감일"을 설정할수 있음.
- 반복기간은 옵셔널이다. 만약 반복기간을 설정하지 않으면 타이머 observable은 한번만 방출된 뒤 완료
- 근데 여기서 발견한게 시간 지연하는 오퍼레이터들은 future subscirbe에도 영향을 미친다는 사실
print(" ===== timer ===== " )
_ = Observable<Int>
.timer(3, scheduler: MainScheduler.instance)
.flatMap { _ in
Observable.of(1,2,3,4,5)
.delay(.seconds(Int(3)), scheduler: MainScheduler.instance)
}
.subscribe(onNext:{ print("timer -> \($0)") })
.disposed(by: disposeBag)
// 결과값
timer -> 1
timer -> 2
timer -> 3
timer -> 4
timer -> 5
timeout
- timeout연산자의 주된 목적은 타이머를 시간초과(오류) 조건에 대해 구별하는 것이다.
- 따라서 timeout 연산자가 실행되면, RxError.TimeoutError라는 에러이벤트를 방출해요.
- 만약 에러가 잡히지 않으면 sequence를 완전히 종료
- 여기 코드에서는 에러날 일이 없지만, 버튼을 탭하는 이벤트의 경우 n초 안에 이벤트가 나타나지 않으면 시간초과로 에러 발생시켜서 stop event로 만듦.
print(" ===== timeOut ===== ")
Observable.of(1,2,3,4,5)
.timeout(.seconds(3), scheduler: MainScheduler.instance)
.subscribe(onNext: { print("timeout -> \($0)") })
.disposed(by: disposeBag)
// 결과값
timeout -> 1
timeout -> 2
timeout -> 3
timeout -> 4
timeout -> 5
'apple > RxSwift, ReactorKit' 카테고리의 다른 글
| RxSwift + MVVM: 예제 코드 흐름 따라가기 #1 (2) | 2021.07.15 |
|---|---|
| RxSwift - Relay와 Subject (0) | 2021.07.12 |
| RxSwift 스터디 7주차 Combining Observables (0) | 2021.07.11 |
| RxSwift 스터디 6주차 Transforming Observables (0) | 2021.07.10 |
| RxSwift 스터디 5주차 Filtering Observables (0) | 2021.07.10 |