새로운 Observable을 만드는 연산자들 - Create, Deffered, Empty, Never, error, from, interval, just, range, repeat, start, timer
안녕하세요 ◠‿◠ 고고입니다.
1. Create
- Create — 직접적인 코드 구현을 통해 옵저버 메서드를 호출하여 Observable을 생성한다
구현부
public static func create(_ subscribe: @escaping (AnyObserver<Element>) -> Disposable) -> Observable<Element> {
AnonymousObservable(subscribe)
}
예시:
let source : Observable = Observable.create { observer in
for i in 1...5 {
observer.on(.next(i))
}
observer.on(.completed)
// Note that this is optional. If you require no cleanup you can return
// `Disposables.create()` (which returns the `NopDisposable` singleton)
return Disposables.create {
print("disposed")
}
}
source.subscribe {
print($0)
}
// next(1)
// next(2)
// next(3)
// next(4)
// next(5)
// completed
// disposed
2. Deferred
- Defer — 옵저버가 구독하기 전까지는 Observable 생성을 지연하고 구독이 시작되면 옵저버 별로 새로운 Observable을 생성한다
구현부
public static func deferred(_ observableFactory: @escaping () throws -> Observable<Element>)
-> Observable<Element> {
Deferred(observableFactory: observableFactory)
}
예시:
var flag = true
let observable: Observable<String> = Observable.deferred {
flag.toggle()
if flag {
return Observable.from(["a", "a"])
} else {
return Observable.from(["b", "b"])
}
}
observable
.subscribe { print($0) }
.disposed(by: disposeBag)
// a
// a
// completed
observable
.subscribe { print($0) }
.disposed(by: disposeBag)
// b
// b
// completed
상태에 따라 다른 데이터를 처리해야할 필요가 있을 경우를 대처할 수 있습니다.
3. Empty / Never / Throw
empty : 항목은 없지만 정상적으로 종료되는 옵저버블
구현부
public static func empty() -> Observable<Element> {
EmptyProducer<Element>()
}
예시
Observable<Void>.empty()
.subscribe { print($0) }
.disposed(by: disposeBag)
// completed
never : 항목을 방출하지 않고 종료하지 않는 옵저버블
구현부
public static func never() -> Observable<Element> {
NeverProducer()
}
예시
Observable<Void>.never()
.subscribe { print($0) }
.disposed(by: disposeBag)
// ...
Throw : 항목을 방출하지 않고 오류로 종료되는 옵저버블
구현부
public static func error(_ error: Swift.Error) -> Observable<Element> {
ErrorProducer(error: error)
}
예시
enum MyError: Error {
case error
}
Observable<Void>.error(MyError.error)
.subscribe { print($0) }
.disposed(by: disposeBag)
// error(error)
- Empty/Never/Throw — 아주 정확하고 제한된 행동을 하는 Observable을 생성한다
4. From
- From — 다른 객체나 자료 구조를 Observable로 변환한다
구현부
public static func from(_ array: [Element], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
ObservableSequence(elements: array, scheduler: scheduler)
}
예시
let numbers = [1,2,3,4,5]
let source = Observable.from(numbers)
source.subscribe {
print($0)
}
// next(1)
// next(2)
// next(3)
// next(4)
// next(5)
// completed
5. Interval
- Interval — 특정 시간별로 연속된 정수형을 배출하는 Observable을 생성한다
구현부
public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType)
-> Observable<Element> {
return Timer(
dueTime: period,
period: period,
scheduler: scheduler
)
}
예시
let source = Observable<Int>.interval(0.5, scheduler: MainScheduler.instance)
source.subscribe(onNext: { _ in
print("0.5초가 지났습니다")
})
// 0.5초마다 0.5초가 지났습니다 출력
6. Just
- Just — 객체 하나 또는 객채집합을 Observable로 변환한다. 변환된 Observable은 원본 객체들을 발행한다
구현부
public static func just(_ element: Element) -> Observable<Element> {
Just(element: element)
}
예시
let source = Observable.just(1, 2, 3)
source.subscribe {
print($0)
}
// next((1, 2, 3))
// completed
let source2 = Observable.just([1,2,3])
source2.subscribe {
print($0)
}
// next([1, 2, 3])
// completed
7. Range
- Range — 연속된 범위(Range)의 정수를 발행하는 Observable을 생성한다
구현부
public static func range(start: Element, count: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
RangeProducer<Element>(start: start, count: count, scheduler: scheduler)
}
예시
let source = Observable.range(start: 1, count: 5)
source.subscribe {
print($0)
}
// next(1)
// next(2)
// ...
// next(5)
8. Repeat
- Repeat — 특정 항목이나 연속된 항목들을 반복적으로 배출하는 Observable을 생성한다
구현부
public static func repeatElement(_ element: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
RepeatElement(element: element, scheduler: scheduler)
}
예시
let source = Observable.repeatElement("A")
source.subscribe {
print($0)
}
// "A"
// ...
// 무한루프
9. Start
- Start — 함수의 실행 결과를 배출하는 Observable을 생성한다
RxSwift에 없는 거 같습니다. (댓글 부탁드려요)
10. Timer
- Timer — 지정된 시간이 지나고 난 후 항목을 하나 배출하는 Observable을 생성한다
구현부
public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType)
-> Observable<Element> {
return Timer(
dueTime: dueTime,
period: period,
scheduler: scheduler
)
}
예시
let source = Observable<Int>.timer(.seconds(1), scheduler: MainScheduler.instance)
source.subscribe {
print($0)
}
// 1초 후
// next(0)
// completed
출처 : http://reactivex.io/documentation/ko/operators.html
'RxSwift' 카테고리의 다른 글
[RxSwift] Operators - 유틸리티(6) (0) | 2021.11.29 |
---|---|
[RxSwift] Operators - 오류 처리(5) (0) | 2021.11.20 |
[RxSwift] Operators - 결합(4) (0) | 2021.11.20 |
[RxSwift] Operators - 필터링(3) (0) | 2021.11.19 |
[RxSwift] Operators - 변환(2) (0) | 2021.11.19 |
댓글