Tunko Development Diary

RxSwift) Time-based Operators(timer, timeout) 본문

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 를 구독자에게 전달하며 종료됩니다.

반응형
Comments