반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- RxSwift
- Bug
- typeorm
- vim
- graphql
- NullObject
- NavigationLink
- Operater
- swift6
- Xcode
- IOS
- Operators
- nestjs
- @Environment
- RFC1738/1808
- operator
- dismiss
- SwiftUI
- init?
- subject
- Creating Operators
- init
- ios14
- URL(string:)
- SWIFT
- nonisolated
- @State
- RxCocoa
- @Binding
- @EnvironmentObject
Archives
- Today
- Total
Tunko Development Diary
RxSwift) Time-based Operators(timer, timeout) 본문
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 를 구독자에게 전달하며 종료됩니다.
반응형
'Development > RxSwift' 카테고리의 다른 글
RxSwift) sharing Subscription Operator (multicast, publish, replay) (0) | 2022.06.08 |
---|---|
RxSwift) Time-based Operators(delay, delaySubscription) (0) | 2022.06.07 |
RxSwift) Time-based Operators ( interval ) (0) | 2022.06.06 |
RxSwift) Conditional Operators(amb) (0) | 2022.06.06 |
RxSwift) Transforming Operators(withLatestFrom, sample, switchLatest) (0) | 2022.06.06 |
Comments