728x90
반응형
Creating에 속하는 empty, never, throw에 대해 알아볼 것이다.
Empty
1. 정의
empty는 아무 것도 emit하지 않는 옵저버블을 생성하지만 정상적으로 종료시킨다.
즉, 그냥 빈 값으로 종료만 시키는 것!
2. 구현부
public static func empty() -> Observable<Element> {
EmptyProducer<Element>()
}
final private class EmptyProducer<Element>: Producer<Element> {
override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
observer.on(.completed)
return Disposables.create()
}
}
EmptyProducer에서 보면 onCompleted 처리를 해주고 있는 것을 볼 수 있다.
3. 사용 예시
let observable = Observable<Void>.empty()
observable
.subscribe { print($0) }
.disposed(by: disposeBag)
// completed
즉시 종료되는 옵저버블을 반환하고 싶을 때나, 의도적으로 빈 값을 내뱉도록 하고 싶을 때 사용할 수 있다.
Never
1. 정의
never은 아무것도 emit하지 않고 종료되지도 않는다. 즉, 무한한 상태이다!
스트림에 아무런 표시가 없는 걸 볼 수 있다.
2. 구현부
public static func never() -> Observable<Element> {
NeverProducer()
}
final private class NeverProducer<Element>: Producer<Element> {
override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
Disposables.create()
}
}
empty와 달리 구현부에 onCompleted가 구현되지 않은 것을 볼 수 있다.
3. 사용 예시
let observable = Observable<Any>.never()
observable
.subscribe { print($0) }
.disposed(by: disposeBag)
// 아무 것도 반환X
이를 subscribe하면 onNext나 onCompleted는 반환(emit)되지 않는다!
Error
1. 정의
아무것도 emit하지 않고 단일 에러(.error) 이벤트와 함께 종료된다.
(문서에는 throw라고 되어있지만 RxSwift에서는 error가 이에 대응하는 것 같다!)
스트림에 에러말고는 보이는게 없다!
2. 구현부
public static func error(_ error: Swift.Error) -> Observable<Element> {
ErrorProducer(error: error)
}
final private class ErrorProducer<Element>: Producer<Element> {
private let error: Swift.Error
init(error: Swift.Error) {
self.error = error
}
override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
observer.on(.error(self.error))
return Disposables.create()
}
}
onError만 처리하고 있는 것을 볼 수 있다!
3. 사용 예시
enum CustomError: Error {
case error
}
let observable = Observable<Void>.error(CustomError.error)
observable
.subscribe { print($0) }
.disposed(by: disposeBag)
// error(error)
데이터 저장과 같은 과정의 실패를 설명하는데 유용하다. (URLSession에서 error 처리해주는 것과 비슷한 느낌!)
Ref :
http://reactivex.io/documentation/operators/empty-never-throw.html
https://www.stepintoswift.com/rxswift-operator-error
728x90
반응형