Development/RxSwift
RxSwift) Time-based Operators(timer, timeout)
Tunko
2022. 6. 7. 16:44
timer
timer는 interval 연산자와 다르게 시작 시간을 지정할 수 있습니다.
public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType)
-> Observable<Element> {
return Timer(
dueTime: dueTime,
period: period,
scheduler: scheduler
)
}
dueTime는 구독자에게 이벤트 전달되는 시작 시간입니다. preiod: 파라미터가 반복주기입니다.
let disposBag = DisposeBag()
print("시작 : \\(Date())")
Observable<Int>.timer(.seconds(1), period: .milliseconds(200), scheduler: MainScheduler.instance)
.take(20)
.subscribe { elem in
print("Next", elem)
} onError: { error in
print("Error", error)
} onCompleted: {
print("onCompleted")
} onDisposed: {
print("Disposed 끝 : \\(Date())")
}
.disposed(by: disposBag)
출력
시작 : 2022-06-07 07:08:30 +0000
Next 0
Next 1
Next 2
Next 3
Next 4
Next 5
Next 6
Next 7
Next 8
Next 9
Next 10
Next 11
Next 12
Next 13
Next 14
Next 15
Next 16
Next 17
Next 18
Next 19
onCompleted
Disposed 끝 : 2022-06-07 07:08:34 +0000
timeout
timeout은 아래 구현된 코드처럼 2가지 방식으로 구현 되었습니다.
public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
-> Observable<Element> {
return Timeout(source: self.asObservable(), dueTime: dueTime, other: Observable.error(RxError.timeout), scheduler: scheduler)
}
public func timeout<Source: ObservableConvertibleType>(_ dueTime: RxTimeInterval, other: Source, scheduler: SchedulerType)
-> Observable<Element> where Element == Source.Element {
return Timeout(source: self.asObservable(), dueTime: dueTime, other: other.asObservable(), scheduler: scheduler)
}
dueTime 인자로 전달한 시간 안에 Next 이벤트가 전달되지 않으면 종료됩니다.
두번째 매개변수인 other: Source 은 구독이 종료되었을때 마지막으로 구독자에게 전달되는 Source 입니다.
let disposeBag = DisposeBag()
let subject = PublishSubject<Int>()
subject.timeout(.seconds(3), other: Observable.just(100), scheduler: MainScheduler.instance)
.subscribe{print($0)}
.disposed(by: disposeBag)
Observable<Int>.timer(.seconds(2), period: .seconds(2), scheduler: MainScheduler.instance)
.take(5)
.subscribe { subject.onNext($0) }
.disposed(by: disposeBag)
출력
next(0)
next(1)
next(2)
next(3)
next(4)
next(100)
completed
출력 결과를 보면 next(0) 이 방출되기 전에 3초동안 아무런 반응이 없다가 방출되는것을 확인할 수 있습니다.
이후 2초마다 timer연산자를 통해 이벤트가 subject에 next 이벤트가 전달됩니다.
.take(5) 를 통해 5번의 전달 이후 전달하지 않고.
3초의 outtime이 경과하면 other : Source 를 구독자에게 전달하며 종료됩니다.
반응형